代码之家  ›  专栏  ›  技术社区  ›  Ku Zijie

试图理解Python 3.9中命名元组的“_field_defects”

  •  -1
  • Ku Zijie  · 技术社区  · 2 年前

    我是Python的新手 namedtuple 尤其 _field_defaults .

    根据Python 3.12.3 official doc ,

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

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

    Copilot's suggestion

    上面的基于文本的代码片段。

    from collections import namedtuple
    
    # Define the namedtuple
    Person = namedtuple('Person', 'name age')
    
    # Set default values
    Person._field_defaults['name'] = 'John'
    Person._field_defaults['age'] = 30
    
    # Create a namedtuple with default values
    person1 = Person()
    
    # Create a namedtuple with a different name
    person2 = Person(name='Alice')
    
    print(person1)  # Outputs: Person(name='John', age=30)
    print(person2)  # Outputs: Person(name='Alice', age=30)
    

    产生了以下错误。

    >>> 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的实现 命名的元组 ? 我想了解更多关于如何 _字段故障 使用。

    假设我创建了 Account = namedtuple('Account', ['type', 'name', 'id']) , 有办法为指定默认值吗 type id 并让用户提供 name ? 当然,我可以定义 Account 成为 Account = namedtuple('Account', ['type', 'name', 'id'], defaults = ['default_type', None, account_id]) 。但是,有没有办法避免 None 在中 defaults 领域

    1 回复  |  直到 2 年前
        1
  •  1
  •   tdelaney    2 年前

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

    至于违约顺序 documentation

    由于具有默认值的字段必须位于没有的任何字段之后 默认情况下,默认值应用于最右侧的参数。

    这就是python函数的调用方式,因此命名为tuple必须玩游戏。