2013-02-24 3 views
2

Когда я пытаюсь следующее я получаю ошибкуименованные аргументы Python ссылающихся друг друга

def test_func(key1=2.7, key2=key1*3.5): 
    print(key1, key2) 

NameError: name 'key1' is not defined 

Мое решение было бы что-то вроде

def test_func(key1=2.7, key2=None): 
    if not key2: 
     key2 = key1*3.5 

    print(key1, key2) 

, но это выглядит отчасти уродливой для меня. У кого-нибудь есть лучшее решение?

редактировать:

так мое окончательное решение

def test_func(key1=2.7, key2=None): 
    if key2 is not None: 
     key2 = key1*3.5 

    print(key1, key2) 

спасибо за все ответы

+0

может быть, вы должны даже изменить, что явный 'является key2 не None' , иначе пользователи не смогут передать '0' в качестве второго аргумента. –

+0

цифры были всего лишь примером, функция, которую я использую, выглядит совсем по-другому, но вы правы. Я об этом не думал. – Peter

ответ

5

Нет, нет лучшего решения.

Определения аргументов функции могут быть выражениями, но они оцениваются только один раз (что иногда удивляет людей, см. "Least Astonishment" and the Mutable Default Argument).

0

Мое решение будет:

def t(key1=1, **kwargs): 
    key2 = kwargs.get('key2', key1*2.7) 

получение key2 из kwargs и получить из него данные с ключом1 по умолчанию * 2,7

+0

Это имеет тот недостаток, что пользователь не получит ошибку, если он передает неожиданный параметр, например 'key3'. Он просто молча игнорирует это. –

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