要创建子类,您可以直接传递字典的键:
MyTuple = namedtuple('MyTuple', d)
现在要根据此字典或任何其他具有匹配键的字典创建元组实例:
my_tuple = MyTuple(**d)
当心: namedtuple 仅 比较 值 (有序)。它们旨在替代常规元组,并具有命名属性访问作为附加功能。 。它可能不是您想要的,也不是您期望的namedtuple
那种!这不同于dict
相等性比较,后者不但考虑了键而且还比较了不可知顺序。
对于实际上并不需要类型是 tuple子类的 读者,首先使用namedtuple可能没有多大意义。如果只想在字段上使用属性访问语法,那么创建名称空间对象将变得更加简单:
>>> from types import SimpleNamespace
>>> SimpleNamespace(**d)
namespace(a=1, b=2, c=3, d=4)
我想将字典转换为namedtuple的原因是,它变得可散列,但仍然像字典一样仍然可用
对于像食谱这样的可散列的“ attrdict”,请检查一个冻结的框:
>>> from @R_985_2419@ import @R_985_2419@
>>> b = @R_985_2419@(d, frozen_@R_985_2419@=True)
>>> hash(b)
7686694140185755210
>>> b.a
1
>>> b["a"]
1
>>> b["a"] = 2
@R_985_2419@Error: @R_985_2419@ is frozen
更高版本的Python中可能还会提供冻结的映射类型,请观看此PEP草案以接受还是拒绝: