命名元组内部命名元组的Python语法

h6my8fg2  于 2023-01-19  发布在  Python
关注(0)|答案(2)|浏览(129)

有没有可能在另一个namedtuple中包含一个namedtuple
例如:

from collections import namedtuple

Position = namedtuple('Position', 'x y')
Token = namedtuple('Token', ['key', 'value', Position])

其给出 "值错误:类型名称和字段名称必须是有效的标识符"
此外,我很好奇是否有一个更 * Python的方法 * 来构建这样一个嵌套容器?

fwzugrvs

fwzugrvs1#

您混淆了两个概念-namedtuple的结构和分配给它们的值。结构需要唯一名称的列表。值可以是任何内容,包括另一个namedtuple

from collections import namedtuple

Position = namedtuple('Position', 'x y')
Token = namedtuple('Token', ['key', 'value', 'position'])

t = Token('ABC', 'DEF', Position(1, 2))
assert t.position.x == 1
bd1hkmkf

bd1hkmkf2#

下面是一个将嵌套字典转换为嵌套命名元组的通用函数

dfrom collections import namedtuple

def dict2namedtuple(name, d):

    values, keys = [], []
    for k in d:
        keys.append(k)

        v = d[k]
        if isinstance(v, dict):
            values.append(dict2namedtuple(k, v))
        else:
            values.append(v)

    T = namedtuple(name, keys)
    return T(*values)

def namedtuple2dict(nt):
    d = {}
    for k in nt._fields:
        v = getattr(nt, k)
        try:
            d[k] = namedtuple2dict(v)
        except AttributeError:
            d[k] = v
    return d

test_dict = {'a': 1, 'b': 2, 'c': {'d': 3, 'e': 4}}

nt = dict2namedtuple('test', d=test_dict)
dc = namedtuple2dict(nt)
assert dc == test_dict
print('namedtuple', nt)
print('dict', dc)

编辑:我为反问题namedtuple2dict添加了一个函数。根据我的经验,namedtuple._asidct()工作正常,但@Chev_603提到了一些问题。

相关问题