В Python я могу указать аргумент функции default в терминах других аргументов?

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

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

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

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

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

Ответ 1

Как говорит @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'

Ответ 2

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

Ответ 3

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