gpt4 book ai didi

python - 在 Python 中使用 Loops 修饰多个导入函数

转载 作者:太空狗 更新时间:2023-10-29 22:18:08 24 4
gpt4 key购买 nike

我是 Python 和装饰器的新手,如果这似乎是一个微不足道的问题,我深表歉意。

我正在尝试使用 Python 中的循环将装饰器应用于多个导入的函数,如下所示

from random import random, randint, choice

def our_decorator(func):
def function_wrapper(*args, **kwargs):
print("Before calling " + func.__name__)
res = func(*args, **kwargs)
print(res)
print("After calling " + func.__name__)
return function_wrapper

for f in [random, randint, choice]:
f = our_decorator(f)

random()
randint(3, 8)
choice([4, 5, 6])

理想情况下,我希望输出采用这种形式:

Before calling random
<random_value>
After calling random
Before calling randint
<random_integer>
After calling randint
Before calling choice
<random_choice>
After calling choice

但是,我只得到选择函数的结果作为输出。

<random_choice among 4,5 6>

装饰器尚未应用于任何函数,并且看起来 random() 和 randint(3,8) 调用也未被执行。

我想知道,这里出了什么问题,可以做些什么来使用循环装饰多个导入函数?

感谢帮助

最佳答案

您正在装饰函数,然后依次将名称 f 绑定(bind)到它们中的每一个。所以在循环之后,f 将等于最后一个装饰函数。原始函数的原始名称不受影响。

你必须使用名称,比如

gl = globals()
for f_name in ['random', 'randint', 'choice']:
gl[f_name] = our_decorator(gl[f_name])

但我非常更愿意将装饰器依次手动应用于每个函数。

关于python - 在 Python 中使用 Loops 修饰多个导入函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41801865/

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