命名元组与字典

Namedtuple vs Dictionary

所以我正在编写一个游戏,我需要一个数据类型来存储大量变量,范围从 liststuplesstringsintegers。我在使用 dictionariesnamedtuples 之间左右为难。

GameData = namedtuple('GameData', ['Stats', 'Inventory', 'Name', 'Health'])
current_game = GameData((20,10,55,3), ['Sword', 'Apple', 'Potion'], 'Arthur', 100)

GameData = {'Stats': (20,10,55,3), 'Inventory': ['Sword', 'Apple', 'Potion'], 'Name': 'Arthur', 'Health': 100}

你看,这里最大的问题是所有这些值都可能改变,所以我需要一个可变数据类型,而不是namedtuple。在文档中查看,namedtuples 似乎有 ._replace(),这是否使其可变?

我也喜欢 namedtuples 有一个 __repr__ 方法以 name=value 格式打印。此外,为 namedtuple 中的每个值分配单独的 __doc__ 字段的功能非常有用。 dictionaries有这个功能吗?

只需使用一个class。 字典的问题在于您不知道应该使用哪些键,并且您的 IDE 将无法为您自动完成。 namedtuple 的问题在于它是不可变的。 使用自定义 class,您可以获得可读属性、可变对象和很大的灵活性。要考虑的一些替代方案:

  • 从 Python 3.7 开始,您可以使用 dataclasses 模块:

    from dataclasses import dataclass
    
    @dataclass
    class GameData:
        stats: tuple
        inventory: list
        name: str
        health: int
    
  • 如果是其他Python版本,你可以试试attrs package:

    import attr
    
    @attr.s
    class GameData:
        stats = attr.ib()
        inventory = attr.ib()
        name = attr.ib()
        health = attr.ib()
    

Looking in the docs, namedtuples appear to have ._replace(), so does that make it mutable?

No,如 documentation 中指定的那样,它会创建一个新的 namedtuple,并替换值。

如果你想让数据可变,你最好自己构造一个class。