Namedtuple VS词典(Namedtuple vs Dictionary)

2019-09-29 00:17发布

所以我编程比赛,我需要一个可以存储变量,从众多数据类型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 。 展望在docs, namedtuples似乎有._replace()这是否使可变的?

我也喜欢怎么namedtuples__repr__ ,在打印方法name=value格式。 此外,分配分开的功能__doc__在每个值字段namedtuple是非常有用的。 有没有这个功能dictionaries

Answer 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() 


Answer 2:

展望在docs, namedtuples似乎有._replace()这是否使可变的?

没有 ,因为在指定的文件 ,它会创建一个新的namedtuple ,用值替换。

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



文章来源: Namedtuple vs Dictionary