Как я могу применить именованный кортеж к функции?

В Python, если у вас есть словарь

d = {'foo': 1, 'bar': False}

Вы можете применить это к функции, которая принимает foo а также bar аргументы по ключевым словам

def func(foo, bar):
    # Do something complicated here
    pass

func(**d)

Но если вместо этого я хотел позвонить func с именованным кортежем, определенным ниже:

from collections import namedtuple
Record = namedtuple('Record', 'foo bar')
r = Record(foo=1, bar=False)
func(r)   # !!! this will not work

Какой синтаксис для этого?

1 ответ

Решение

Экземпляр namedtuple имеет ._asdict() метод:

func(**r._asdict())

но если атрибуты namedtuple находятся в том же порядке, что и аргументы функции, вы можете просто применить ее как последовательность:

func(*r)

Здесь два значения namedtuple применяются по порядку к ключевым аргументам в функции. В конце концов, эти два аргумента можно рассматривать как позиционные аргументы!

Для вашей функции выборки оба работают:

>>> def func(foo, bar):
...     print foo, bar
... 
>>> from collections import namedtuple
>>> Record = namedtuple('Record', 'foo bar')
>>> r = Record(foo=1, bar=False)
>>> func(**r._asdict())
1 False
>>> func(*r)
1 False
Другие вопросы по тегам