【发布时间】:2009-05-15 05:40:57
【问题描述】:
在 python 中,有没有一种方法可以在类方法中使用实例变量作为可选参数?即:
def function(self, arg1=val1, arg2=val2, arg3=self.instance_var):
# do stuff....
任何帮助将不胜感激。
【问题讨论】:
在 python 中,有没有一种方法可以在类方法中使用实例变量作为可选参数?即:
def function(self, arg1=val1, arg2=val2, arg3=self.instance_var):
# do stuff....
任何帮助将不胜感激。
【问题讨论】:
试试这个:
def foo(self, blah=None):
if blah is None: # faster than blah == None - thanks to kcwu
blah = self.instance_var
【讨论】:
所有提示None的回答都是正确的;如果您想确保调用者可以将 None 作为常规参数传递,请使用特殊的 sentinel 并使用 is 进行测试:
class Foo(object):
__default = object()
def foo(self, blah=Foo.__default):
if blah is Foo.__default: blah = self.instavar
对object() 的每次调用都会生成一个唯一的对象,因此is 在它和任何其他值之间永远不会成功。 __default 中的两个下划线表示“高度私有”,这意味着调用者知道他们不应该尝试弄乱它(并且需要做相当多的工作才能这样做,明确地模仿编译器正在做的名称修改)。
顺便说一句,您不能只使用您发布的代码的原因是默认值在 def 语句评估时评估,而不是在调用时稍后;在 def 计算时,还没有 self 可以从中获取实例变量。
【讨论】:
不,因为类函数定义时实例不存在
你必须重写如下
def function(self, arg1=val1, arg2=val2, arg3=None):
if arg3 is None:
arg3 = self.instance_var
这与原来的略有不同:如果你真的想要,你不能传递带有 None 值的 arg3。
替代解决方案:
def function(self, arg1=val1, arg2=val2, **argd):
arg3 = argd.get('arg3', self.instance_var)
【讨论】:
def foo(self, blah=None):
blah = blah if not blah is None else self.instance_var
这适用于 python 2.5 并转发和处理 blah 为空字符串、列表等的情况。
【讨论】:
另一种方法是:
def foo(self, blah=None):
blah = blah or self.instance_var
这个较短的版本看起来更好,特别是当有多个可选参数时。
小心使用。请参阅下面的 cmets...
【讨论】: