Python实例变量作为默认参数

Python实例变量作为默认参数,python,Python,我正在编写一个Python函数,它将超时值作为参数。通常,用户将始终使用相同的超时值,但有时他可能希望等待稍长一点。超时值存储为类实例变量。我想使用类的timeout实例变量作为默认参数。目前,我正在执行以下步骤: def _writeAndWait (self, string, timeout = -1): if (timeout == -1): timeout = self._timeout 我只是想知道,使用实例变量作为默认参数是否合适?或者有没有更好的方法可以避

我正在编写一个Python函数,它将超时值作为参数。通常,用户将始终使用相同的超时值,但有时他可能希望等待稍长一点。超时值存储为类实例变量。我想使用类的timeout实例变量作为默认参数。目前,我正在执行以下步骤:

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

我只是想知道,使用实例变量作为默认参数是否合适?或者有没有更好的方法可以避免“如果”检查?

常用的方法是使用
None
作为默认值

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

您的问题的简短答案是否定的,您不能消除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检查,因为使用某些现有对象作为默认值会有细微的不同(通常是错误的)行为。

在python>2.5中,可以使用以下命令保护一行:

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