Подтвердить что ты не робот

Переменная экземпляра Python как параметр по умолчанию

Я пишу функцию Python, которая принимает значение тайм-аута в качестве параметра. Обычно пользователь всегда будет использовать одно и то же значение тайм-аута, но иногда он может немного подождать. Значение тайм-аута сохраняется как переменная экземпляра класса. Я хочу использовать переменную экземпляра класса timeout как параметр по умолчанию. В настоящее время я реализую это следующим образом:

def _writeAndWait (self, string, timeout = -1):
    if (timeout == -1):
        timeout = self._timeout

Мне просто интересно, правильно ли использовать переменную экземпляра в качестве параметра по умолчанию? Или есть лучший способ избежать проверки "если"?

4b9b3361

Ответ 1

Короткий ответ на ваш вопрос: нет, вы не можете исключить оператор if, потому что Python проверяет подпись только один раз, поэтому по умолчанию используется общий доступ ко всем вызовам. Рассмотрим, например:

def addit(x, L=[]):
    L.append(x)
    return L

Versus:

def addit(x,L=None):
     if L is None:
         L=[]
     L.append(x)
     return L

Эти две функции, хотя они выглядят одинаково, фактически имеют совершенно другое поведение; в первом случае значение по умолчанию L делится между вызовами, так что addit(1), за которым следует addit(2), возвращает в первом случае два объекта, которые фактически указывают на один и тот же базовый объект и имеют значение [1,2], а во втором случае он вернет два отдельных объекта, [1] и [2].

Единственная рекомендация, которую я имею для вас, заключается в том, чтобы использовать значение по умолчанию None просто потому, что это стандартное соглашение для параметров, которые не были указаны, но продолжить использование проверки if, поскольку использование по умолчанию значение какого-либо существующего объекта будет иметь незначительно отличающееся (обычно неправильное) поведение.

Ответ 2

Общим способом является использование None в качестве значения по умолчанию

def _writeAndWait (self, string, timeout=None):
    if timeout is None:
        timeout = self._timeout

Ответ 3

В python > 2.5 вы можете защитить одну строку с помощью оператора тернарного условия:

def _writeAndWait (self, string, timeout=None):
    timeout = self._timeout if timeout is None else timeout