2012-01-17 3 views
8

Пожалуйста, обратите внимание простую функцию:функции с зависимыми заданными аргументами

def fun(x, y, param1=10, param2=param1/3): 
    do something 

param1 Где и param2 не требуется, но может быть установлен пользователем. Если param2 не установлен, значение зависит от param1.

Приведенный выше пример поднимет NameError: name 'param1' is not defined

Есть ли способ сделать это своего рода уступки в Python?

ответ

12

Один из способов заключается в эмулировать внутри функции:

def fun(x, y, param1=10, param2=None): 
    if param2 is None: 
     param2 = param1/3 
    # do something 

Если param2=None действительный вход в fun(), следующее может быть лучшей альтернативой:

default = object() 

def fun(x, y, param1=10, param2=default): 
    if param2 is default: 
     param2 = param1/3 
    # do something 

(будучи глядя этот второй пример в течение нескольких минут, мне действительно очень нравится синтаксис is default.)

Причина возникновения inal версия не работает, так это то, что значения по умолчанию вычисляются и привязываются к времени определения функции. Это означает, что вы не можете иметь значение по умолчанию, которое зависит от того, что неизвестно до тех пор, пока функция не будет вызвана (в вашем случае значение param1).

+2

'default' может ввести в заблуждение,' not_set' может быть лучшим именем. Непонятно (для меня) с первого взгляда, что 'default' не является значением по умолчанию, а заполнителем, сигнализирующим, что должно использоваться значение по умолчанию для параметра param2. – jfs

Смежные вопросы