命名元组与字典
Namedtuple vs Dictionary
所以我正在编写一个游戏,我需要一个数据类型来存储大量变量,范围从 lists
、tuples
、strings
和 integers
。我在使用 dictionaries
或 namedtuples
之间左右为难。
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。
所以我正在编写一个游戏,我需要一个数据类型来存储大量变量,范围从 lists
、tuples
、strings
和 integers
。我在使用 dictionaries
或 namedtuples
之间左右为难。
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。