当然,“除了明显的后果之外没有后果”是对我关于后果的问题的有效答案。
我帮助维护一个代码库,一些建议的代码结构大致如下:
# 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()
使用 importlib 根据传入的字符串查找名为 processor 的模块country
。
输出如设计:
> ./main.sh
This is the Brazil CountryProcessor
This is the France CountryProcessor
我们有一些类似的代码(但使用sys.path.insert()
)已经运行了几个月;我不知道同名类会导致问题的任何情况。
如果有的话,这种设计可能会产生什么意想不到的后果?