Python передает функции только те параметры, которые не являются нулевыми

#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. Вопрос дал функцию, в которой все значения по умолчанию, по сути, отсутствуют. Он не хочет передавать какие-либо переменные, которые не являются таковыми. Таким образом, значения по умолчанию все равно не будут переданы второй функции. Но я понимаю вашу точку зрения, две функции (его и моя) на самом деле разные.