如何将namedtuple应用于函数?

8
在Python中,如果你有一个字典
d = {'foo': 1, 'bar': False}

您可以将此应用于接受foobar关键字参数的函数中,方法如下:
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

这个的语法是什么?

你是不是指的是最后一个代码块中的 func(*r) - mr2ert
你尝试过使用func(*d)吗?也就是说,尝试将其作为可变参数而不是字典来使用? - wheaties
mr2ert,将其作为答案写下来,我会接受它。一个小实验表明,它们确实通过关键字匹配。 - fatuhoku
@fatuhoku 没关系。其他答案已经很详细地解释了这个问题,所以你可以选择其中一个答案接受。不过还是谢谢你的回复!:) - mr2ert
好的,我的上一个评论是不正确的。像标记答案所建议的那样,namedtuple字段的应用是位置相关的。我的“实验”是有缺陷的。 - fatuhoku
1个回答

14

命名元组实例具有 ._asdict() 方法

func(**r._asdict())

但是,如果命名元组的属性与函数参数的顺序相同,您可以将其视为序列应用:

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

你可能想要包括参数的数量也应该相同。 - thefourtheye
1
@thefourtheye:这也适用于将字典应用为关键字参数的情况;这并不是仅适用于命名元组的特殊情况。 - Martijn Pieters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接