gpt4 book ai didi

Python:包装递归函数

转载 作者:太空狗 更新时间:2023-10-29 20:54:40 26 4
gpt4 key购买 nike

如何包装递归函数,包括递归调用?例如,给定 foowrap:

def foo(x):
return foo(x - 1) if x > 0 else 1

def wrap(f):
def wrapped(*args, **kwargs):
print "f was called"
return f(*args, **kwargs)

return wrapped

wrap(foo)(x) 只会在第一次调用时输出 "f was called"。递归调用仍然寻址 foo()

我不介意猴子修补,或在内部探索。我不打算将这段代码添加到下一个核弹头处理程序中,所以即使这是一个坏主意,我也想实现这个效果。

编辑:例如,修补 foo.func_globals 以覆盖 foo.__name__ 是否可行?如果总是这样,我应该注意任何副作用吗?

最佳答案

如果您将包装函数用作装饰器,它会起作用。

def wrap(f):
def wrapped(*args, **kwargs):
print "f was called"
return f(*args, **kwargs)

return wrapped

@wrap
def foo(x):
return foo(x - 1) if x > 0 else 1

原因是在您的示例中,您只调用一次 wrap 函数的结果。如果您将它用作装饰器,它实际上会用装饰函数替换模块命名空间中 foo 的定义,因此它的内部调用解析为包装版本。

关于Python:包装递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10574227/

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