2013-10-09 4 views
1

У меня есть сценарий, который импортирует модуль, у которого есть функция, которую я хочу немного изменить. Допустим, модуль имеет функции разделить и run_program:Как обращаться с небольшим изменением метода от установленного модуля?

def _divide(var): 
    return 1/var 

run_program(x): 
    do some stuff 
    _divide(x) 
    do more stuff 

Вместо этого, я хочу, чтобы это сделать

def divide(var): 
    if var == 0: 
     var = 1e-131 
    return 1/var 

    run_program(x): 
     do some stuff 
     _divide(x) 
     do more stuff 

Я теперь изменил функцию в модуле. Однако, если я хочу запустить программу где-то в другом месте, мне также нужно изменить модуль. Поскольку функция, которую я хочу изменить, вызывается из модуля, я не могу ее перезаписать (насколько я знаю). Могу ли я изменить функцию из своего сценария, чтобы мне не пришлось менять установленный модуль?


Edit: Модуль https://pypi.python.org/pypi/dirichlet/0.7 функция:

def _init_a(D): 
'''Initial guess for Dirichlet alpha parameters given data D''' 
    E = D.mean(axis=0) 
    E2 = (D**2).mean(axis=0) 
    return ((E[0] - E2[0])/(E2[0]-E[0]**2)) * E 

ответ

3

Вы можете заменить функции динамически в Python:

import module 

old_divide = module._divide 

def new_divide(var): 
    if var == 0: 
     var = 1e-131 
    return old_divide(var) 

module._divide = new_divide 

Когда run_program тогда называется он будет использовать функцию замены ; поиск _divide выполняется, когда run_program вызывается, а не когда модуль загружен.

+0

Не могли бы вы рассказать об этом? – Vivek

+0

@Vivek: Разработайте, что именно? –

+0

Я имею в виду, его практическое использование и как это обрабатывается внутри python. – Vivek

Смежные вопросы