python - Python:重新定义函数,使其引用自己的自身
问题描述
假设我有一些功能fun
,其实际代码体超出了我的控制范围。我可以创建一个新函数,在调用之前进行一些预处理fun
,即
def process(x):
x += 1
return fun(x)
如果我现在想process
代替fun
所有未来的电话fun
,我需要做类似的事情
# Does not work
fun = process
然而,这不起作用,因为这会产生一个循环引用问题,就像现在fun
从fun
. 我发现的一个解决方案是引用fun
inside of的副本process
,如下所示:
# Works
import copy
fun_cp = copy.copy(fun)
def process(x):
x += 1
return fun_cp(x)
fun = process
但是这个解决方案让我很困扰,因为我真的不知道 Python 如何构造函数的副本。我想我的问题与使用继承和super
函数扩展类方法的问题相同,但这里我没有类。
我怎样才能正确地做到这一点?我认为这是一项足够普遍的任务,应该存在一些或多或少惯用的解决方案,但我没有找到它。
解决方案
这看起来像是 python 闭包的一个用例。有一个函数返回你的函数。
def getprocess(f):
def process(x):
x += 1
return f(x) # f is referenced from the enclosing scope.
return process
myprocess = getprocess(fun)
myprocess = getprocess(myprocess)
推荐阅读
- vb.net - 试图从本地 DataTable 中获取 ListBox 所选项目的总和到标签中
- javascript - 我们是否需要使用 async/await 将返回值包装到 Promise 中?
- apache - 使用 .htaccess mod_rewrite 将部分 URL 重写到特定页面
- html - 一个 div 与另一个 div 对接时包装,而不是堆叠在其上
- c# - 无法加载文件或程序集 'System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 或其依赖项之一
- go - 在golang中动态创建结构数组
- ruby-on-rails - RSpec Controller 测试屏幕上的文本失败
- graph-databases - 如何在 JanusGraph 中合并两个顶点并删除其中一个。还将删除顶点的边添加到修改的顶点
- javascript - 数据表行中的链接行为与数据表外的链接行为不同
- mysql - 需要为mysql适配脚本