gpt4 book ai didi

python - python 中的类方法 : default kwargs from attributes of self

转载 作者:太空宇宙 更新时间:2023-11-03 13:28:45 28 4
gpt4 key购买 nike

是否可以定义一个将 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 也可能是一个值,您需要创建一个任何人都不会通过的私有(private)哨兵:

_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 - python 中的类方法 : default kwargs from attributes of self,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50902933/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com