gpt4 book ai didi

python - 按名称重新定义 python 函数的默认参数

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

为了提高效率,我不想为此任务使用 functools.partial(使用函数时会增加开销)。我想按名称重新定义函数的复制默认参数。

目前我有以下内容:

import types


# http://stackoverflow.com/questions/6527633/how-can-i-make-a-deepcopy-of-a-function-in-python
def copy_func(f, name=None, defaults=None):
return types.FunctionType(f.__code__, f.__globals__, name or f.__name__, defaults or f.__defaults__, f.__closure__)


def f(a, b, c):
return 'a = {}, b = {} and c = {}'.format(a,b,c)

i = copy_func(f, 'i', (4,5))

print(f(3,4,5))
print(i('should be a'))

我们可以修改 copy_func 工具,使其像这样被调用吗:

i = copy_func(f, a = 4, b = 5)

即,使用原始函数中的参数名称。

当然,如果参数不存在,我希望函数能对我大喊大叫;)

最佳答案

我相信你能做到:

import inspect

def copy_func(f, name=None, **defaults):
args = inspect.getfullargspec(f).args
arg_defaults = tuple(defaults.get(arg) for arg in args)

return types.FunctionType(f.__code__, f.__globals__, name or f.__name__, arg_defaults or f.__defaults__, f.__closure__)

由于我们需要为 FunctionType 的默认值提供一个元组 (arg_defaults),我们可以生成这个元组 通过遍历 f 的参数并查看哪些参数具有 defaults 中提供的默认值。我们使用 defaults.get 而不是 defaults[...] 因为缺少默认值是 NoneFunctionType.

copy_func(f, 'i', a = 4, b = 5)()

结果:

'a = 4, b = 5 and  c = None'

如果您希望函数在 defaults 包含无效参数时对您大喊大叫,则需要在 args 的声明之间添加此显式条件>arg_defaults:

if not all(arg in args for arg in defaults.keys()):
raise ValueError("defaults contains invalid arguments")

关于python - 按名称重新定义 python 函数的默认参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62716727/

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