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

时间:2010-09-11 18:37:03

标签: django python

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

import module1

module1.func1 = lambda x: return True

5 个答案:

答案 0 :(得分:11)

import module1
import unittest

class MyTest(unittest.TestCase):
    def setUp(self):
        # Replace othermod.function with our own mock
        self.old_func1 = module1.func1
        module1.func1 = self.my_new_func1

    def tearDown(self):
        module1.func1 = self.old_func1

    def my_new_func1(self, x):
        """A mock othermod.function just for our tests."""
        return True

    def test_func1(self):
        module1.func1("arg1")

许多模拟库提供了进行此类模拟的工具,您应该对它们进行调查,因为您可能会从中获得大量帮助。

答案 1 :(得分:4)

import foo

def bar(x):
    pass

foo.bar = bar

答案 2 :(得分:2)

只需为旧名称指定一个新函数或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

答案 3 :(得分:2)

使用redef:http://github.com/joeheyming/redef

import module1
from redef import redef

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

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

答案 4 :(得分:1)

如果要重新加载到正在编辑的解释器文件foo.py中,可以创建一个简单的类型函数并使用execfile(),但我刚刚知道没有全局列表它不起作用所有功能(遗憾地),除非有人有更好的想法:

文件foo.py中的某处:

def refoo ():
  global fooFun1, fooFun2
  execfile("foo.py")

在python解释器中:

  
    
      

refoo()#您现在可以从foo.py

获得最新的编辑内容