Django 如何在python中重新定义函数?

Django 如何在python中重新定义函数?,django,python,Django,Python,我在某个模块中得到了一个函数,为了测试的目的,我想在运行时重新定义(mock)。据我所知,函数定义只不过是python中的赋值(模块定义本身就是一种正在执行的函数)。正如我所说的,我想在测试用例的设置中这样做,因此要重新定义的函数存在于另一个模块中。这样做的语法是什么? 例如,“module1”是我的模块,“func1”是我的函数,在我的测试用例中,我尝试过这一点(没有成功): 只需将新函数或lambda分配给旧名称: >>> def f(x): ... return

我在某个模块中得到了一个函数,为了测试的目的,我想在运行时重新定义(mock)。据我所知,函数定义只不过是python中的赋值(模块定义本身就是一种正在执行的函数)。正如我所说的,我想在测试用例的设置中这样做,因此要重新定义的函数存在于另一个模块中。这样做的语法是什么? 例如,“module1”是我的模块,“func1”是我的函数,在我的测试用例中,我尝试过这一点(没有成功):


只需将新函数或lambda分配给旧名称:

>>> def f(x):
...     return x+1
... 
>>> f(3)
4
>>> def new_f(x):
...     return x-1
... 
>>> f = new_f
>>> f(3)
2
当一个函数来自另一个模块时,它也起作用:

### In other.py:
# def f(x):
#    return x+1
###

import other

other.f = lambda x: x-1

print other.f(1)   # prints 0, not 2

许多模拟库都提供了用于执行此类模拟的工具,您应该对它们进行研究,因为您可能会从它们那里获得大量帮助。

如果您想重新加载到正在编辑的解释器文件foo.py中,您可以创建一个简单的to-type函数并使用execfile(),但我刚刚了解到,如果没有所有函数的全局列表,它就无法工作(很遗憾),除非有人有更好的想法:

import foo

def bar(x):
    pass

foo.bar = bar
文件foo.py中的某处:

def refoo ():
  global fooFun1, fooFun2
  execfile("foo.py")
在python解释器中:

refoo()#您现在可以从foo.py获得最新编辑

使用redef:


当rd_f1超出范围或被删除时,func1将恢复正常

正如我所说,该函数位于另一个模块中,请检查我的编辑。您知道我是否可以使用闭包重新定义该函数吗?您也可以像在示例中一样使用lambda,它不一定是一个方法。您不需要在
lambda
中返回
return
module1.func1=lambda x:True
应该可以。最简单也是最好的解决方案。如果bar被定义为
bar(self,…)
,这就不起作用了,或者是真的吗?我以为ref counted scope是一个CPython的东西,这种东西在其他平台上是不起作用的(pypypy、Jython、IronPython)。redef所做的只是用新函数/属性包装函数或属性。当对象超出范围时,将调用delete函数,该函数将函数声明恢复为使用旧函数/属性。这不是ref-counted作用域类型的东西,但是“对象超出作用域时发出信号”的概念依赖于CPython ref-counting,不是吗?例如,在PyPy中,当文件对象的变量超出范围时,对象不会立即被垃圾收集,因此在收集器决定关闭之前,文件不会被关闭。根据我对代码的理解,它依赖于在超出范围时调用
\uuu del\uuu
,以及调用
del
(在
\uu退出). 所以我想对于不使用CPython的少数人来说,这个模块需要一个警告。(派比的解释是:)除了依赖del或exit,还有其他选择吗?
import foo

def bar(x):
    pass

foo.bar = bar
def refoo ():
  global fooFun1, fooFun2
  execfile("foo.py")
import module1
from redef import redef

rd_f1 = redef(module1, 'func1', lambda x: True)