gpt4 book ai didi

python - 仅扩展函数所需的键值对

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

假设我们有一个函数,它接受一些参数和一个字典,该字典是调用该函数所需的值的超集:

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

def foo(a, b):
print(a, b)

# this won't work
foo(**d)

# this works but is tedious the more values there are
foo(**{k: v for k,v in d.items() if k not in ("c")})

有没有更优雅的解决方案?

最佳答案

不要这样做:

def foo(a, b):
print(a, b)

你可以这样做:

def foo(a, b, **kwargs):
print(a, b)

然后该函数将忽略所有不需要的参数。

但是,在我看来,这种方法存在一些问题。

  1. 有时您并不拥有该函数的源代码。当然,您可以创建很多包装函数。如果您手动执行此操作,则每次库作者修改函数签名时,您都必须更改辅助函数的签名。

  2. 此解决方案可能会使某些错误更难发现。也许最好明确声明您仅使用字典中的某些元素。

您仍然可以使用标准库的 inspect 模块使其变得更容易。

a) 创建一个装饰器,使函数过滤其关键字参数。

例如:

import inspect

def filter_kwargs(f):
arg_names = inspect.getargspec(f).args
def _f(*args, **kwargs):
return f(*args, **{k: v for k, v in kwargs.items() if k in arg_names})
return _f

# Use it like this:
filter_kwargs(foo)(a_dict)

b) 您可以创建一个函数来转换参数以适应该函数

def fit_for(f, kwargs):
arg_names = inspect.getargspec(f).args
return {k: v for k, v in kwargs.items() if k in arg_names}

foo(fit_for(foo, a_dict))
<小时/>

您也可以扩展此函数,以将原始函数中的 *args**kwargs 考虑在内。

<小时/>

如果这是代码中重复出现的模式,您可以将字典作为单个参数传递。

此外,正如 @chepner 在评论中指出的那样,请考虑创建一个类。

关于python - 仅扩展函数所需的键值对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60727724/

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