В Python я могу указать аргумент функции по умолчанию в терминах других аргументов? - PullRequest
27 голосов
/ 01 января 2011

Предположим, у меня есть функция python, которая принимает два аргумента, но я хочу, чтобы второй аргумент был необязательным, а значением по умолчанию было все, что было передано в качестве первого аргумента. Итак, я хочу сделать что-то вроде этого:

def myfunc(arg1, arg2=arg1):
    print (arg1, arg2)

За исключением того, что это не работает. Единственный обходной путь, который я могу придумать, это:

def myfunc(arg1, arg2=None):
    if arg2 is None:
        arg2 = arg1
    print (arg1, arg2)

Есть ли лучший способ сделать это?

Ответы [ 3 ]

24 голосов
/ 01 января 2011

Как говорит @Ignacio, вы не можете этого сделать.В последнем примере может возникнуть ситуация, когда None является допустимым значением для arg2.Если это так, вы можете использовать значение часового:

sentinel = object()
def myfunc(arg1, arg2=sentinel):
    if arg2 is sentinel:
        arg2 = arg1
    print (arg1, arg2)

myfunc("foo")           # Prints 'foo foo'
myfunc("foo", None)     # Prints 'foo None'
4 голосов
/ 01 января 2011

Второй способ, на мой взгляд, хорош: совершенно ясно, что вы делаете, и для всех тех, кто придет за вами и прочитает код.Хотя при документировании поведения по умолчанию возникают небольшие накладные расходы, очень часто встречается использование None или любого другого, чтобы ваша функция генерировала значение по умолчанию.На мой взгляд, размещение логики внутри вызовов функций не будет похвальным, но очень скоро может стать очень сложным.Так что просто оставьте его в теле функции, где весь код.

4 голосов
/ 01 января 2011

Не совсем. Имена других аргументов не существуют, пока функция фактически не введена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...