首页 > 解决方案 > 将 NamedTuple 转换为 dict 以用于字典解包 (**kwargs) 的 Pythonic 方式

问题描述

我有一个typing.NamedTuple我想转换为的dict,以便我可以通过字典解包传递给一个函数:

def kwarg_func(**kwargs) -> None:
    print(kwargs)

# This doesn't actually work, I am looking for something like this
kwarg_func(**dict(my_named_tuple))

完成此任务的最 Pythonic 方式是什么?我正在使用 Python 3.8+。


更多细节

这是一个NamedTuple可以使用的示例:

from typing import NamedTuple

class Foo(NamedTuple):
    f: float
    b: bool = True

foo = Foo(1.0)

尝试kwarg_func(**dict(foo))引发TypeError

TypeError: cannot convert dictionary update sequence element #0 to a sequence

根据这篇文章collections.namedtuple_asdict()作品:

kwarg_func(**foo._asdict())
{'f': 1.0, 'b': True}

但是,既然_asdict是私人的,我想知道,有没有更好的方法?

标签: pythondictionarynamedtupleiterable-unpacking

解决方案


使用._asdict.

._asdict不是私人的。它是 API 的一个公开的、记录在案的部分。从文档

除了从元组继承的方法外,命名元组还支持三个附加方法和两个属性。为防止与字段名称冲突,方法和属性名称以下划线开头。


推荐阅读