我正在编写一个Python函数,它将超时值作为参数。通常,用户将始终使用相同的超时值,但有时他可能想要稍微等待一段时间。超时值存储为类实例变量。我想使用类的超时实例变量作为默认参数。目前,我正在实施如下:
def _writeAndWait (self, string, timeout = -1):
if (timeout == -1):
timeout = self._timeout
我只是想知道,使用实例变量作为默认参数的正确方法是什么?或者有更好的方法可以避免“if”检查吗?
答案 0 :(得分:16)
一种常见的方法是使用None
作为默认值
def _writeAndWait (self, string, timeout=None):
if timeout is None:
timeout = self._timeout
答案 1 :(得分:14)
对你的问题的简短回答是否定的,你不能消除if语句,因为Python只检查签名一次,因此默认值在所有调用中共享。例如,考虑一下:
def addit(x, L=[]):
L.append(x)
return L
对战:
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检查,因为使用as作为一个默认值,一些现有对象将有微妙的不同(通常是错误的)行为。
答案 2 :(得分:1)
在python> 2.5中,您可以使用ternary condition operator:
来保护一行def _writeAndWait (self, string, timeout=None):
timeout = self._timeout if timeout is None else timeout