命名元组 vs 字典

3

我正在编写一个游戏,并且需要一种数据类型,可以存储各种变量,包括列表、元组、字符串和整数。我在使用字典或命名元组之间犹豫不决。

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`。查阅文档,`namedtuple` 看起来有 `._replace()` 方法,那么它是可变的吗?
我也喜欢 `namedtuple` 有一个打印成 `name=value` 格式的 `__repr__` 方法。此外,为 `namedtuple` 中的每个值分配独立的 `__doc__` 字段功能非常有用。在字典中是否有这种功能?
2个回答

12

只需使用 class。字典的问题在于您不知道要预期哪些键,而您的IDE将无法为您自动完成。命名元组的问题在于它不可变。使用自定义类,您可以获得易读属性,可变对象和许多灵活性。考虑一些替代方案:

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

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

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

1
另外,“字典的问题在于你不知道可以期望哪些键”,你是什么意思? - Alice
1
我的意思是,通过字典你不需要声明结构。当然,你在某个地方创建了它,但是它可以在代码的其他地方发生变化。 - matino
VS Code 能够为字典建议键。 - netotz

3
在文档中查找时,似乎namedtuples具有._replace(),那么这是否使其可变? 不是,正如文档中指定的一样,它会创建一个新的namedtuple,并替换其值。
如果您想让数据可变,最好自己构建一个类。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接