gpt4 book ai didi

python - 使用装饰器将函数插入模块的命名空间

转载 作者:行者123 更新时间:2023-12-04 17:00:50 24 4
gpt4 key购买 nike

我有一个装饰器,但我想将原始函数存储在命名空间中以供将来引用,这样我最终会得到该函数的装饰和非装饰版本。
我将原始函数插入到命名空间中,如下所示:

def crossover(cross):  
def ecspy_crossover(random, candidates, args):
# ... decorator magic
globals()['single_'+cross.func_name] = cross

但是,当我导入模块时,single_* 函数没有出现。
当我在这个模块中启动 pdb 时,这个函数出现在命名空间中......
[没有 __all__本模块中的声明...]

有任何想法吗?

最佳答案

为什么不将原始函数添加为包装函数的属性?事实上,这正是functools.wraps在 Python 3.2 中,它将原始函数存储在 __wrapped__ 中属性。

关于你的问题,我猜你的问题是你将函数添加到包含装饰器的模块的全局命名空间中,而不是被装饰函数的全局命名空间中。您可以使用 f.__globals__获得正确的全局命名空间。

关于python - 使用装饰器将函数插入模块的命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5076560/

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