Python实例变量作为默认参数

时间:2010-05-14 00:19:33

标签: python

我正在编写一个Python函数,它将超时值作为参数。通常,用户将始终使用相同的超时值,但有时他可能想要稍微等待一段时间。超时值存储为类实例变量。我想使用类的超时实例变量作为默认参数。目前,我正在实施如下:

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

我只是想知道,使用实例变量作为默认参数的正确方法是什么?或者有更好的方法可以避免“if”检查吗?

3 个答案:

答案 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