是否可以定义将属性self
作为默认关键字参数的类方法?即我想做一些等同于以下的事情:
class Foo:
def __init__(self, bar):
self.bar = bar
def do_a_thing(self, my_arg=self.bar):
do_something_else(my_arg)
当然,这会引发错误:
x = Foo(y)
x.do_a_thing()
NameError: name 'self' is not defined
希望很清楚,我希望得到什么样的行为。呼叫x.do_a_thing()
应等同于x.do_a_thing(my_arg=x.bar)
。
有没有办法做到这一点?
每当您需要无法轻易静态指定的默认值时,惯用法就是使用前哨值。
如果None
不是任何人都可以通过的有效值,请使用:
def do_a_thing(self, my_arg=None):
if my_arg is None:
my_arg = self.bar
do_something_else(my_arg)
或者,如果没有虚假的值将永远是有效的:
def do_a_thing(self, my_arg=None):
if not my_arg:
my_arg = self.bar
do_something_else(my_arg)
或者,即使None
可能是一个值,您也需要创建一个私人哨兵,任何人都不会通过:
_sentinel = object()
def do_a_thing(self, my_arg=_sentinel):
if my_arg is _sentinel:
my_arg = self.bar
do_something_else(my_arg)
顺便说一句,将其称为“默认关键字参数”意味着严重的误解。函数定义中默认值的语法与函数调用中关键字参数的语法相似的事实是一个巧合。特别是,这不是关键字参数,可以在不使用关键字参数的情况下调用它。例如:
my_thing.do_a_thing(20)
如果您实际上只想使用仅关键字的参数,则它必须在后面*
(或*args
,如果有其中之一)之后。而且,由于这些是完全不相关的功能,因此您可以具有仅关键字的参数,而没有默认值:
def do_a_thing(self, *, my_arg):
do_something_else(my_arg)
而且,“ kwargs”通常不用作“关键字参数”或“关键字参数”的简写,而是用于**kwargs
收集所有未知关键字参数的参数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句