gpt4 book ai didi

python - 如何使用包含比函数参数更多的项目的字典调用函数?

转载 作者:IT老高 更新时间:2023-10-28 22:17:01 25 4
gpt4 key购买 nike

我正在寻找将函数与字典相结合的最佳方法包含比函数输入更多的项目

在这种情况下,基本的 **kwarg 解包失败:

def foo(a,b):
return a + b

d = {'a':1,
'b':2,
'c':3}

foo(**d)
--> TypeError: foo() got an unexpected keyword argument 'c'

经过一番研究,我想出了以下方法:

import inspect

# utilities
def get_input_names(function):
'''get arguments names from function'''
return inspect.getargspec(function)[0]

def filter_dict(dict_,keys):
return {k:dict_[k] for k in keys}

def combine(function,dict_):
'''combine a function with a dictionary that may contain more items than the function's inputs '''
filtered_dict = filter_dict(dict_,get_input_names(function))
return function(**filtered_dict)

# examples
def foo(a,b):
return a + b

d = {'a':1,
'b':2,
'c':3}

print combine(foo,d)
--> 3

我的问题是:这是处理这个问题的好方法,还是有更好的做法,或者语言中是否有我可能缺少的机制?

最佳答案

制作一个 decorator 怎么样? 仅过滤允许的关键字参数:

import inspect


def get_input_names(function):
'''get arguments names from function'''
return inspect.getargspec(function)[0]


def filter_dict(dict_,keys):
return {k:dict_[k] for k in keys}


def filter_kwargs(func):
def func_wrapper(**kwargs):
return func(**filter_dict(kwargs, get_input_names(func)))
return func_wrapper


@filter_kwargs
def foo(a,b):
return a + b


d = {'a':1,
'b':2,
'c':3}

print(foo(**d))

这个装饰器的好处是它是通用的和可重用的。而且您不需要更改调用和使用目标函数的方式。

关于python - 如何使用包含比函数参数更多的项目的字典调用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36102075/

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