2010-05-14 2 views
12

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

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

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

ответ

12

Короткий ответ на ваш вопрос нет, вы не можете устранить, если заявление, потому что 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, поскольку использование в качестве значения по умолчанию некоторый существующий объект будет иметь тонко различное (обычно неправильное) поведение.

14

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

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

В питона> 2,5 можно безопасно одна строка с помощью ternary condition operator:

def _writeAndWait (self, string, timeout=None): 
    timeout = self._timeout if timeout is None else timeout 
Смежные вопросы