4

所以我正在编写一个游戏,我需要一个可以存储大量变量的数据类型,范围从lists、和. 我在使用或之间犹豫不决。tuplesstringsintegersdictionariesnamedtuples

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此外,为 中的每个值分配单独__doc__字段的功能namedtuple非常有用。有这个功能dictionaries吗?

4

2 回答 2

12

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

  • 从 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()
    
于 2017-01-12T12:19:29.213 回答
2

查看文档,namedtuples似乎有._replace(),所以这是否使它可变?

,如文档中所述,它会创建一个新的namedtuple,并替换值。

如果您希望数据是可变的,您最好自己构建一个类。

于 2017-01-12T12:23:03.337 回答