开发者

How do I redefine functions in python?

开发者 https://www.devze.com 2023-01-15 23:57 出处:网络
I got a 开发者_JAVA百科function in a certain module that I want to redefine(mock) at runtime for testing purposes. As far as I understand, function definition is nothing more than an assignment in pyt

I got a 开发者_JAVA百科function in a certain module that I want to redefine(mock) at runtime for testing purposes. As far as I understand, function definition is nothing more than an assignment in python(the module definition itself is a kind of function being executed). As I said, I wanna do this in the setup of a test case, so the function to be redefined lives in another module. What is the syntax for doing this? For example, 'module1' is my module and 'func1' is my function, in my testcase I have tried this (no success):

import module1

module1.func1 = lambda x: return True


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")

Lots of mocking libraries provide tools for doing this sort of mocking, you should investigate them as you will likely get a good deal of help from them.


import foo

def bar(x):
    pass

foo.bar = bar


Just assign a new function or lambda to the old name:

>>> def f(x):
...     return x+1
... 
>>> f(3)
4
>>> def new_f(x):
...     return x-1
... 
>>> f = new_f
>>> f(3)
2

It works also when a function is from another module:

### 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


Use redef: http://github.com/joeheyming/redef

import module1
from redef import redef

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

When rd_f1 goes out of scope or is deleted, func1 will go back to being back to normal


If you want to reload into the interpreter file foo.py that you are editing, you can make a simple-to-type function and use execfile(), but I just learned that it doesn't work without the global list of all functions (sadly), unless someone has a better idea:

Somewhere in file foo.py:

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

In the python interpreter:

refoo() # You now have your latest edits from foo.py

0

精彩评论

暂无评论...
验证码 换一张
取 消