我是 Python 的新手
namedtuple
,特别是 _field_defaults
。
根据Python 3.12.3官方文档,
一些
将字段名称映射到默认值的字典。namedtuple._field_defaults
为什么 Copilot 建议的以下代码片段不起作用?
产生以下错误。
>>> person1 = Person()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: <lambda>() missing 2 required positional arguments: 'name' and 'age'
为什么
p._field_defaults['age'] = 100
更改了字典,但Person
的默认构造却没有更新?
>>> Person=namedtuple('Person', ['name', 'age'], defaults=['default_name', 0])
>>> p = Person()
>>> p
Person(name='default_name', age=0)
>>> p._field_defaults
{'name': 'default_name', 'age': 0}
>>> p._field_defaults['age'] = 100
>>> p = Person()
>>> p
Person(name='default_name', age=0)
>>>
在哪里可以找到 Python
namedtuple
的实现?我想了解更多有关_field_defaults
如何使用的信息。
假设我创建了
Account = namedtuple('Account', ['type', 'name', 'id'])
,
有没有办法指定 type
和 id
的默认值并让用户提供 name
?当然,我可以将Account
定义为Account = namedtuple('Account', ['type', 'name', 'id'], defaults = ['default_type', None, account_id])
。但是,有没有办法避免将 None
放在 defaults
字段中?
collections.__init__.py
找到实现。 namedtuple
创建新类型。在当前实现 (3.13) 中,默认值实际上是类型的 __new__
方法上的元组。 _field_names
仅供参考。这是因为...,好吧,我不知道。以“_”开头的内容是可能随时更改的实现细节。 default
参数是在 python 3.7 中添加的,其实现可能会随着时间的推移而发生变化。您确实不应该依赖于它在任何给定版本上的工作方式(就像 codepilot 片段所做的那样)。
至于默认顺序,文档指出
因为具有默认值的字段必须位于任何不带默认值的字段之后 默认值,默认值应用于最右边的参数。
这就是Python函数的调用方式,所以namedtuple必须玩这个游戏。