要创建子类,您可以直接传递字典的键:
from collections import namedtuple
MyTuple = namedtuple('MyTuple', d)
现在从此字典或具有匹配键的任何其他字典创建元组实例:
my_tuple = MyTuple(**d)
Beware:命名元组比较仅值(订购)。它们被设计为常规元组的直接替代品,并具有命名属性访问作为附加功能。进行相等比较时不会考虑字段名称。这可能不是您想要或期望的namedtuple
类型!这不同于dict
相等比较,它确实考虑了键并且比较顺序不可知。
对于那些并不真正需要类型的读者元组的子类,首先使用命名元组可能没有多大意义。如果您只想在字段上使用属性访问语法,那么创建会更简单、更容易名称空间 https://docs.python.org/3/library/types.html#types.SimpleNamespace对象代替:
>>> from types import SimpleNamespace
>>> SimpleNamespace(**d)
namespace(a=1, b=2, c=3, d=4)
我想要将字典转换为命名元组的原因是它变得可散列,但通常仍然可以像字典一样使用
对于像菜谱这样的可散列“attrdict”,请查看冷冻的box https://github.com/cdgriffith/Box/:
>>> from box import Box
>>> b = Box(d, frozen_box=True)
>>> hash(b)
7686694140185755210
>>> b.a
1
>>> b["a"]
1
>>> b["a"] = 2
BoxError: Box is frozen
Python 的更高版本中可能还会出现冻结的映射类型,请观看此 PEP 草案以了解接受或拒绝:
PEP 603 -- 将 freezemap 类型添加到集合中 https://www.python.org/dev/peps/pep-0603/