2013-04-02 6 views
2

У меня есть код следующим образом: Co-зависимые аргументы по умолчанию

import random 

def helper(): 
    c = random.choice([False, True]), 
    d = 1 if (c == True) else random.choice([1, 2, 3]) 
    return c, d 

class Cubic(object): 
    global coefficients_bound 

    def __init__(self, a = random.choice([False, True]), 
     b = random.choice([False, True]), 
     (c, d) = helper()): 
     ... 
     ... 
функция

Помощника() вводятся как я не могу иметь созависимые аргументы в определении самой функции - Python жалуется, что не может найти c, когда он вычисляет d.

Я хочу, чтобы иметь возможность создать объект этого класса, как это так, изменяя значение параметра по умолчанию:

x = Cubic(c = False) 

Но я получаю эту ошибку:

Traceback (most recent call last): 
    File "cubic.py", line 41, in <module> 
    x = Cubic(c = False) 
TypeError: __init__() got an unexpected keyword argument 'c' 

Возможно ли это с тем, как я Это написано? Если нет, то каким образом я должен это делать?

+5

Я сомневаюсь, что это работает, как вы думаете, что будет - по умолчанию аргумент вызывающий 'random.choice()' будет выбран, когда функция будет создана, и тогда же каждый время называется. [Этот вопрос объясняет, почему.] (Http://stackoverflow.com/questions/1132941/least-astonishment-in-python-the-mutable-default-argument). –

+0

@ Lattyware спасибо за напоминание. Я прочитал это раньше, но я не думал об актуальности при использовании random.choice – nebffa

ответ

6

Как насчет просто:

class Cubic(object): 
    def __init__(self, c=None, d=None): 
     if c is None: 
      c = random.choice([False, True]) 
     if d is None: 
      d = 1 if c else random.choice([1, 2, 3]) 
     print c, d 
+2

+1 - ОП, похоже, слишком усложнил это. Обратите внимание, что PEP-8 рекомендует использовать пробелы с обеих сторон аргументов '=' по умолчанию. –

+0

@Lattyware OP очень усложнил это. Спасибо за вашу заметку о PEP-8. – nebffa

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