我正在编写一个Python函数,它将超时值作为参数.通常,用户将始终使用相同的超时值,但有时他可能想要稍微等待一段时间.超时值存储为类实例变量.我想使用类的超时实例变量作为默认参数.目前,我正在实施如下:
def _writeAndWait (self, string, timeout = -1):
if (timeout == -1):
timeout = self._timeout
Run Code Online (Sandbox Code Playgroud)
我只是想知道,使用实例变量作为默认参数的正确方法是什么?或者有更好的方法可以避免"if"检查吗?
Joh*_*ooy 17
常用的方法是使用None默认值
def _writeAndWait (self, string, timeout=None):
if timeout is None:
timeout = self._timeout
Run Code Online (Sandbox Code Playgroud)
Mic*_*yan 15
对你的问题的简短回答是否定的,你不能消除if语句,因为Python只检查签名一次,因此默认值在所有调用中共享.例如,考虑一下:
def addit(x, L=[]):
L.append(x)
return L
Run Code Online (Sandbox Code Playgroud)
与:
def addit(x,L=None):
if L is None:
L=[]
L.append(x)
return L
Run Code Online (Sandbox Code Playgroud)
这两个函数虽然看起来相同但实际上有完全不同的行为; 在第一个中,L的默认值在调用之间共享,因此在第一种情况下,addit(1)后面addit(2)将返回两个实际指向同一底层对象并且值为的对象[1,2],而在第二种情况下它将返回两个单独的对象,[1]和[2].
那么我唯一的建议就是使用默认值,None因为这是未指定参数的标准约定,但继续使用if检查,因为使用某个现有对象作为默认值巧妙地区别(通常是错误的)行为.