#python #user-defined-functions #nonetype
Вопрос:
У меня есть функция с четырьмя параметрами a
, b
, c
и d
, как показано ниже.
def myfunc(a=None,b=None,c=None,d=None): if lt;check which are not Nonegt;: myfunc2(lt;pass those which are not Nonegt;)
Мне нужно вызвать другую функцию myfunc2
внутри этой функции, но только с теми параметрами, которые передал пользователь myfunc
. Например, если пользователь передает значения для a
и d
в myfunc
, то мне нужно позвонить myfunc2
как:
myfunc2(a=a, d=d)
Есть ли простой способ сделать это, а не писать if
кейсы для всех возможных комбинаций a,b,c,d
?
Комментарии:
1. Является
myfunc2
ли неисполнение аргументов чем-то иным, чемNone
? Иначе это ничего бы не изменило.
Ответ №1:
Вы можете использовать понимание диктанта для создания словаря с параметрами not none и передать его myfunc2
через распаковку.
def myfunc(a=None,b=None,c=None,d=None): params = { "a": a, "b": b, "c": c, "d": d, } not_none_params = {k:v for k, v in params.items() if v is not None}) myfunc2(**not_none_params)
Ответ №2:
def myfunc(**kwargs): myfunc2(**{k:v for k, v in kwargs.items() if v is not None})
Если вы хотите сохранить сигнатуру вызова функции с 4 указанными аргументами по умолчанию, вы можете сделать это:
def myfunc(a=None, b=None, c=None, d=None): def f(**kwargs): return myfunc2(**{k:v for k, v in kwargs.items() if v is not None}) return f(a=a, b=b, c=c, d=d)
Комментарии:
1. Не полезно ИМО. Если у OP есть аргументы по умолчанию, которые по умолчанию
None
равны . И ваша функция принимает**kwargs
, зачем кому-то передавать что-то подобноеmyfunc(a=2, b=None, c=None, d=3)
?? Весь смысл вопроса в том, что ОП пройдетmyfunc(a=2, d=3)
2. Чтобы прояснить мою точку зрения, давайте предположим, что OP установит некоторые переменные, зависящие
None
/переменные по умолчанию. Если определение функции таковоmyfunc(**kwargs)
, то оно не имеет значений по умолчанию. Итак, обходной путь был бы такимmyfunc(a=1, b=None, c=None, d=2)
. Разве это не противоречит цели аргументов по умолчанию?3. Вопрос дал функцию, в которой все значения по умолчанию, по сути, отсутствуют. Он не хочет передавать какие-либо переменные, которые не являются таковыми. Таким образом, значения по умолчанию все равно не будут переданы второй функции. Но я понимаю вашу точку зрения, две функции (его и моя) на самом деле разные.