2010-04-05 3 views
0

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

def method(self, arg1=0, arg2=self.member): 

Видимо, это не допускается. Должен ли я писать его по-другому или, возможно, использовать значение arg2, чтобы сигнализировать, когда использовать переменную-член?

ответ

2
def method(self, arg1=0, arg2=None): 
    if arg2 is None: 
     arg2 = self.member 
    ... 
+0

Это не позволяет вызывающему абоненту передать «Нет» явно, что может быть в порядке, но не в других. Часовая идиома, которую я предлагаю в моем A, является «более тяжелой» (еще одно заявление в классе), но гораздо более общее. –

+0

+1: Очень, очень редко можно ожидать «Нет» как законное значение; он склонен нарушать свои ожидания, чтобы сказать «foo (bar = None)»; зачем вообще упоминать «бар»? Это проще и охватывает более 99,7% случаев на практике. –

+0

@Alex, так как это, вероятно, вопрос начинающего питона, я предоставил простейшее решение. В некотором роде ни один не является часовым :) – Yaroslav

5

Да, использовать часовой - например:

class Foo(object): 
    _sentinel = object() 
    def method(self, arg1=0, arg2=_sentinel): 
     if arg2 is self._sentinel: arg2 = self.member 
     ... 
    ... 

к сведению, что вам нужно barename _sentinel в def, но self._sentinel в теле методы (так как это, как обзорные работает в классе телах против метода тела;-).

+0

+1: Хороший ответ, особенно мысли о '_sentiel' в определении метода vs' self._sentiel' в теле метода. – gorsky

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