基于目录名通过importlib加载同名类的设计有哪些非预期后果?
动态加载同名处理器的设计潜在风险
当然,“除显而易见的问题外无其他后果”也是我关于该设计后果相关问题的有效答案。
我参与维护一套代码库,目前有提案的代码结构大致如下:
# main.sh export PYTHONPATH=$PYTHONPATH:$(pwd) python main.py "brazil" python main.py "france"
# main.py from importlib.util import find_spec, module_from_spec import sys class BaseProcessor(object): # abstract base class pass def run_for(country): spec = find_spec(country + ".processor") module = module_from_spec(spec) spec.loader.exec_module(module) processor = module.CountryProcessor() processor.do_something() if __name__ == "__main__": run_for(sys.argv[1])
# brazil/processor.py from main import BaseProcessor class CountryProcessor(BaseProcessor): def do_something(self): print("This is the Brazil CountryProcessor")
# france/processor.py from main import BaseProcessor class CountryProcessor(BaseProcessor): def do_something(self): print("This is the France CountryProcessor")
run_for() 函数的逻辑基于传入的字符串参数country,通过importlib查找对应目录下名为processor的模块。程序运行输出符合预期:
> ./main.sh This is the Brazil CountryProcessor This is the France CountryProcessor
我们有一段类似实现(但采用sys.path.insert() 方式完成导入)已经稳定运行数月,尚未遇到过同名类引发异常问题的场景。
核心问题:这种基于目录名动态加载同名类的设计,可能会引发哪些非预期的后果?
内容的提问来源于stack exchange,提问作者Philip
相关产品推荐
相关产品推荐

