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).
有没有办法做到这一点?
解决方法 无论何时你想要一个不能静态指定的默认值,这个习惯用法就是使用一个sentinel值.如果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)
或者,如果Even甚至可以是一个值,你需要创建一个没人会传递的私人哨兵:
_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参数.
总结以上是内存溢出为你收集整理的python中的类方法:来自self属性的默认kwargs全部内容,希望文章能够帮你解决python中的类方法:来自self属性的默认kwargs所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)