7O'*_*ock 0 python import python-import
我正在编写一个Python3程序,我需要能够动态覆盖某些方法.我的文件夹结构更像是:
./
prog.py
methods/
add.py
minus.py
Run Code Online (Sandbox Code Playgroud)
在prog.py我想调用一个calc()在add.py和中定义的函数minus.py.我希望代码可以像以下一样工作:
def prog('foo'):
from method.foo import calc
calc()
Run Code Online (Sandbox Code Playgroud)
但是在函数中间导入似乎很糟糕,可能会减慢整个程序的速度.有没有可以达到同样效果的解决方法?
我试图变得灵活,以便稍后可以添加更多方法,因此我避免使用if语句并立即导入所有模块.
你有2个选择:
calc属性一起使用.calc备用名称导入功能from ... import ... as无论哪种方式,我都会将函数引用存储在字典中,而不是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]()
Run Code Online (Sandbox Code Playgroud)
或者第二个:
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]()
Run Code Online (Sandbox Code Playgroud)
如果您需要动态导入模块,那么使用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]()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
46 次 |
| 最近记录: |