Как я могу применить именованный кортеж к функции?
В 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