Как мне переопределить функции в Python? - PullRequest
9 голосов
/ 11 сентября 2010

Я получил функцию в определенном модуле, которую я хочу переопределить (макет) во время выполнения для целей тестирования. Насколько я понимаю, определение функции - это не что иное, как присваивание в python (само определение модуля является своего рода выполняемой функцией). Как я уже сказал, я хочу сделать это в настройках тестового примера, чтобы функция, которую нужно переопределить, находилась в другом модуле. Каков синтаксис для этого? Например, 'module1' - это мой модуль, а 'func1' - моя функция, в моем тестовом примере я пробовал это (безуспешно):

import module1

module1.func1 = lambda x: return True

Ответы [ 5 ]

11 голосов
/ 11 сентября 2010
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")

Множество библиотек насмешек предоставляют инструменты для такого рода насмешек, вы должны изучить их, так как вы, вероятно, получите от них большую помощь.

4 голосов
/ 11 сентября 2010
import foo

def bar(x):
    pass

foo.bar = bar
2 голосов
/ 11 сентября 2010

Просто назначьте новую функцию или лямбду старому имени:

>>> 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
1 голос
/ 17 июля 2012

Использовать переопределение: http://github.com/joeheyming/redef

import module1
from redef import redef

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

Когда rd_f1 выходит из области видимости или удаляется, func1 возвращается к нормальному состоянию

1 голос
/ 04 декабря 2011

Если вы хотите перезагрузить файл интерпретатора foo.py, который вы редактируете, вы можете создать функцию простого типа и использовать execfile (), но я только что узнал, что она не работает без глобального списка.из всех функций (к сожалению), если у кого-то нет лучшего представления:

Где-то в файле foo.py:

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

В интерпретаторе python:

refoo () # Теперь у вас есть последние изменения от foo.py

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...