Там функция, которая принимает необязательные аргументы.
def alpha(p1="foo", p2="bar"):
print('{0},{1}'.format(p1, p2))
Позвольте мне повторить, что происходит, когда мы используем эту функцию по-разному:
>>> alpha()
foo,bar
>>> alpha("FOO")
FOO,bar
>>> alpha(p2="BAR")
foo,BAR
>>> alpha(p1="FOO", p2=None)
FOO,None
Теперь рассмотрим случай, когда я хочу называть его alpha("FOO", myp2)
а myp2
будет либо содержать значение, которое нужно передать, либо быть None
. Но даже если функция обрабатывает p2=None
, я хочу использовать ее значение по умолчанию "bar"
.
Может быть, это сформулировано смутно, поэтому позвольте мне сказать следующее:
Если
myp2 is None
, вызовитеalpha("FOO")
. Иначе, вызовитеalpha("FOO", myp2)
.
Различие имеет значение, потому что alpha("FOO", None)
имеет другой результат, чем alpha("FOO")
.
Как я могу (но читающе) сделать это различие?
Одна из возможностей, как правило, заключалась бы в том, чтобы проверить отсутствие в alpha
, что будет поощряться, потому что это сделает код более безопасным. Но предположим, что alpha
используется в других местах, где он фактически должен обрабатывать None
как он.
Я бы хотел обработать это на стороне вызывающего абонента.
Одна из возможностей - сделать различие в делах:
if myp2 is None:
alpha("FOO")
else:
alpha("FOO", myp2)
Но это может быстро стать большим количеством кода, когда есть несколько таких аргументов. (экспоненциально, 2 ^ n)
Другая возможность - просто выполнить alpha("FOO", myp2 or "bar")
, но это требует, чтобы мы знали значение по умолчанию. Обычно, я бы, вероятно, пошел с таким подходом, но позже я мог бы изменить значения по умолчанию для alpha
и этот вызов затем должен быть обновлен вручную, чтобы по-прежнему вызывать его с (новым) значением по умолчанию.
Я использую python 3.4, но было бы лучше, если бы ваши ответы могли обеспечить хороший способ работы в любой версии python.
Вопрос технически закончен здесь, но я снова пересказываю какое-то требование, так как первый ответ затушевал:
Я хочу, чтобы поведение alpha
со значениями по умолчанию "foo", "bar"
сохранялось в целом, поэтому (возможно) это не вариант изменения самой alpha
.
В еще нескольких других словах предположим, что alpha
используется где-то еще как alpha("FOO", None)
где ожидается выход FOO,None
.