gpt4 book ai didi

python - Typing.NamedTuple 和可变默认参数

转载 作者:行者123 更新时间:2023-12-04 11:42:28 44 4
gpt4 key购买 nike

鉴于我想从类型模块中正确使用命名元组的类型注释:

from typing import NamedTuple, List

class Foo(NamedTuple):
my_list: List[int] = []

foo1 = Foo()
foo1.my_list.append(42)

foo2 = Foo()
print(foo2.my_list) # prints [42]
避免 Python 中可变默认值痛苦的最佳或最干净的方法是什么?我有一些想法,但似乎没有什么是好的
  • 使用 None默认
    class Foo(NamedTuple):
    my_list: Optional[List[int]] = None

    foo1 = Foo()
    if foo1.my_list is None
    foo1 = foo1._replace(my_list=[]) # super ugly
    foo1.my_list.append(42)
  • 覆盖 __new____init__不会工作:
    AttributeError: Cannot overwrite NamedTuple attribute __init__
    AttributeError: Cannot overwrite NamedTuple attribute __new__
  • 特价@classmethod
    class Foo(NamedTuple):
    my_list: List[int] = []

    @classmethod
    def use_me_instead(cls, my_list=None):
    if not my_list:
    my_list = []
    return cls(my_list)

    foo1 = Foo.use_me_instead()
    foo1.my_list.append(42) # works!
  • 也许使用 frozenset并完全避免可变属性?但这不适用于 Dict s 因为没有 frozendict s。

  • 有人有好的答案吗?

    最佳答案

    使用数据类而不是命名元组。 AN 数据类允许字段指定默认工厂而不是单个默认值。

    from dataclasses import dataclass, field


    @dataclass(frozen=True)
    class Foo:
    my_list: List[int] = field(default_factory=list)

    关于python - Typing.NamedTuple 和可变默认参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68681092/

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