Питонический способ преобразования NamedTuple в dict для использования при распаковке словаря (** kwargs)

У меня есть 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))

Каков самый питонический способ добиться этого? Я использую 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 является частным, мне интересно, есть ли лучший способ?


person Intrastellar Explorer    schedule 22.06.2021    source источник


Ответы (1)


Используйте 1_.

._asdict не является личным. Это общедоступная документированная часть API. Из документации:

В дополнение к методам, унаследованным от кортежей, именованные кортежи поддерживают три дополнительных метода и два атрибута. Чтобы предотвратить конфликты с именами полей, имена методов и атрибутов начинаются с подчеркивания.

person juanpa.arrivillaga    schedule 22.06.2021