2013-10-09 20 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 

我现在已经在模块中改变的功能。但是,如果我想在其他地方运行程序,那么我也需要在那里更改模块。 因为我想改变的函数是从模块内调用的,所以我不能覆盖它(据我所知)。我可以更改我的脚本中的功能,以便我不必更改已安装的模块?


编辑:该模块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