gpt4 book ai didi

python - 将 namedtuple 中的信息作为参数传递的更好方法

转载 作者:行者123 更新时间:2023-12-04 07:44:24 24 4
gpt4 key购买 nike

我想从与函数签名共享相同名称的 namedtuple 中给函数值,如果签名中不存在该名称,则跳过它。

import collections
row = collections.namedtuple('row', ['b', 'a', 'c', 'd'])
row1 = row(1,2,3,4)
def assign_rows(a, b, c):
print(a, b, c)
assign_rows(*row1)

返回错误

---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-32-c5dc816f0d5d> in <module>
----> 1 assign_rows(*row1)

TypeError: assign_rows() takes 3 positional arguments but 4 were given

有两个问题,最明显的是上面的错误,而且我希望参数尊重 namedtuple 的名称,所以 a=row1.a, b=row1.b, c=row1.c。有没有一种巧妙的方法可以做到这一点?

最佳答案

您可以将命名元组作为关键字参数传递给函数,方法是将其转换为字典并使用双星运算符:

assign_rows(**row1._asdict())

这仍然会给您带来这样的问题,即您在元组中有一个额外的参数 (d),该参数不是该函数所期望的,这将导致错误。

如果您不介意更改函数,请将 **kwargs 添加到函数签名的末尾。这将抑制错误:

def assign_rows(a, b, c, **kwargs):
print(a, b, c)

如果您打算在代码的其他地方使用该函数,那不是一个干净的解决方案,因为它会抑制在某些情况下可能是有用的错误消息。在这种情况下,您可以使用类似的方式将 namedtuple 与函数签名匹配。

import inspect 

def namedtuple_to_func_args(ntuple, fn_def):
params = inspect.signature(fn_def).parameters
tuple_dict = ntuple._asdict()
return {p : tuple_dict[p] for p in params.keys()}

然后使用

import collections
row = collections.namedtuple('row', ['b', 'a', 'c', 'd'])
row1 = row(1,2,3,4)
def assign_rows(a, b, c):
print(a, b, c)
args = namedtuple_to_func_args(row1, assign_rows)
assign_rows(**args)

根据周围的逻辑,它可能作为装饰器更整洁地工作。您还应该考虑 juanpa 在关于仅使用 a=row1.a 等的评论中所说的话,因为它既简单又高效,具体取决于您使用此模式的频率以及它需要的灵 active

关于python - 将 namedtuple 中的信息作为参数传递的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67269982/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com