【问题标题】:Namedtuple vs Dictionary命名元组与字典
【发布时间】:2017-01-12 12:15:49
【问题描述】:

所以我正在编写一个游戏,我需要一个可以存储大量变量的数据类型,范围从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 有这个功能吗?

【问题讨论】:

    标签: python dictionary types namedtuple python-3.6


    【解决方案1】:

    只需使用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()
      

    【讨论】:

    • 另外,字典的问题是你不知道需要哪些键
    • 我的意思是你不用字典声明结构。当然你在某个地方创建了它,但它可以在你代码的另一个地方发生变异。
    • VS Code 能够建议字典的键
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-17
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多