尝试理解 Python 3.9 中命名元组的 `_field_defaults`

问题描述 投票:0回答:1

我是 Python 的新手

namedtuple
,特别是
_field_defaults

根据Python 3.12.3官方文档

一些

namedtuple._field_defaults
将字段名称映射到默认值的字典。

为什么 Copilot 建议的以下代码片段不起作用?

Copilot's suggestion

产生以下错误。

>>> 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
字段中?

python python-3.9 namedtuple github-copilot
1个回答
0
投票

您可以在

collections.__init__.py
找到实现。
namedtuple
创建新类型。在当前实现 (3.13) 中,默认值实际上是类型的
__new__
方法上的元组。
_field_names
仅供参考。这是因为...,好吧,我不知道。以“_”开头的内容是可能随时更改的实现细节。
default
参数是在 python 3.7 中添加的,其实现可能会随着时间的推移而发生变化。您确实不应该依赖于它在任何给定版本上的工作方式(就像 codepilot 片段所做的那样)。

至于默认顺序,文档指出

因为具有默认值的字段必须位于任何不带默认值的字段之后 默认值,默认值应用于最右边的参数。

这就是Python函数的调用方式,所以namedtuple必须玩这个游戏。

© www.soinside.com 2019 - 2024. All rights reserved.