gpt4 book ai didi

python - 如何卡住可变的默认参数值?

转载 作者:太空宇宙 更新时间:2023-11-04 11:07:18 26 4
gpt4 key购买 nike

Python 选择遵循只对函数签名求值一次的设计决策。所以这段代码:

def test(x=[]):
x.append(5)
return x

print(test())
print(test())

打印:

[5]

[5, 5]

我知道可以使用 None 作为默认值,如果它是 None,则可以更改函数内部的参数值。


如何编写一些代码来更改test 的行为,使默认参数在我每次调用该函数时都重新计算?该解决方案可以包括装饰器并使用类作为默认值。

最佳答案

我们可以使用函数的 __default__ 属性来“卡住”默认值(和 __kwargs__ 来“卡住”默认关键字参数):

def freeze_defaults(func):
defaults = func.__defaults__
kwdefaults = func.__kwdefaults__
@functools.wraps(func)
def wrapper(*args, **kwargs):
func.__defaults__ = copy.deepcopy(defaults)
func.__kwdefaults__ = copy.deepcopy(kwdefaults)
return func(*args, **kwargs)
return wrapper

现在:

@freeze_defaults
def test(x=[]):
x.append(5)
return x

print(test())
print(test())

打印:

[5]

[5]

甚至:

@freeze_defaults
def test(x=['hello!']):
x.append(5)
return x

print(test())
print(test())

打印:

['hello!', 5]

['hello!', 5]

关于python - 如何卡住可变的默认参数值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59126326/

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