如何实现在另一个函数中间重写函数调用?
How can I achieve override a function call in the middle of another function?
我正在编写一个 Python3 程序,其中我需要能够即时覆盖某些方法。我的文件夹结构更像是:
./
prog.py
methods/
add.py
minus.py
在 prog.py
中,我想调用一个在 add.py
和 minus.py
中定义的 calc()
函数。我希望代码可以像这样工作:
def prog('foo'):
from method.foo import calc
calc()
但是在函数中间导入看起来很糟糕,可能会减慢整个程序的速度。是否有任何解决方法可以达到相同的效果?
我正在努力保持灵活性,以便以后可以添加更多方法,所以我避免了 if 语句并一次导入所有模块。
您有 2 个选择:
- 导入模块,并使用带有
calc
属性的模块名称。
- 使用
from ... import ... as
的替代名称导入 calc
函数
无论哪种方式,我都会将函数引用存储在字典中,而不是使用 if .. elif
来选择一个。
第一种方法
from method import add
from method import minus
calc_functions = {
'add': add.calc,
'minus': minus.calc,
}
def prog(method):
return calc_functions[method]()
或第二个:
from method.add import calc as addition
from method.minus import calc as subtraction
calc_functions = {
'add': addition,
'minus': subtraction,
}
def prog(method):
return calc_functions[method]()
如果您需要动态导入模块,那么使用importlib.import_module()
,无需担心名称冲突:
import importlib
def prog(method):
try:
calc_module = importlib.import_module('method.' + method)
except ModuleNotFoundError: # or ImportError in Python < 3.6
raise ValueError('No such method {!r}'.format(method))
return calc_module.calc()
return calc_functions[method]()
我正在编写一个 Python3 程序,其中我需要能够即时覆盖某些方法。我的文件夹结构更像是:
./
prog.py
methods/
add.py
minus.py
在 prog.py
中,我想调用一个在 add.py
和 minus.py
中定义的 calc()
函数。我希望代码可以像这样工作:
def prog('foo'):
from method.foo import calc
calc()
但是在函数中间导入看起来很糟糕,可能会减慢整个程序的速度。是否有任何解决方法可以达到相同的效果?
我正在努力保持灵活性,以便以后可以添加更多方法,所以我避免了 if 语句并一次导入所有模块。
您有 2 个选择:
- 导入模块,并使用带有
calc
属性的模块名称。 - 使用
from ... import ... as
的替代名称导入
calc
函数
无论哪种方式,我都会将函数引用存储在字典中,而不是使用 if .. elif
来选择一个。
第一种方法
from method import add
from method import minus
calc_functions = {
'add': add.calc,
'minus': minus.calc,
}
def prog(method):
return calc_functions[method]()
或第二个:
from method.add import calc as addition
from method.minus import calc as subtraction
calc_functions = {
'add': addition,
'minus': subtraction,
}
def prog(method):
return calc_functions[method]()
如果您需要动态导入模块,那么使用importlib.import_module()
,无需担心名称冲突:
import importlib
def prog(method):
try:
calc_module = importlib.import_module('method.' + method)
except ModuleNotFoundError: # or ImportError in Python < 3.6
raise ValueError('No such method {!r}'.format(method))
return calc_module.calc()
return calc_functions[method]()