【发布时间】:2010-04-05 17:59:25
【问题描述】:
我想编写一个方法,其参数默认为成员变量,如下所示:
def method(self, arg1=0, arg2=self.member):
显然这是不允许的。我应该以不同的方式编写它,还是使用arg2 的值来指示何时使用成员变量?
【问题讨论】:
我想编写一个方法,其参数默认为成员变量,如下所示:
def method(self, arg1=0, arg2=self.member):
显然这是不允许的。我应该以不同的方式编写它,还是使用arg2 的值来指示何时使用成员变量?
【问题讨论】:
是的,使用哨兵——例如:
class Foo(object):
_sentinel = object()
def method(self, arg1=0, arg2=_sentinel):
if arg2 is self._sentinel: arg2 = self.member
...
...
请注意,您需要在 def 中使用裸名 _sentinel,但在方法主体中需要 self._sentinel(因为这是在类主体与方法主体中的作用域;-)。
【讨论】:
_sentiel 与方法主体中的self._sentiel 的想法。
def method(self, arg1=0, arg2=None):
if arg2 is None:
arg2 = self.member
...
【讨论】:
None,这在某些情况下可能是可以的,但在其他情况下则不行。我在 A 中建议的哨兵习语稍微“重”(课堂范围内的另一个陈述)但更笼统。
None 视为合法值是非常非常罕见的;不得不说foo( bar=None )往往会出乎意料;为什么要提到bar?这更简单,并且涵盖了超过 99.7% 的实际案例。
somedict.pop 中,您必须明确指定 None 作为默认值,如果这是你想要什么,否则当他们的钥匙丢失时你会得到一个例外。