python - Python 字符串到模块引用
问题描述
有没有办法从字符串中“引用”模块?例如,以下是相当重复的:
module = "module1"
if module == "module1":
module1.function1()
elif module == "module2":
module2.function1()
elif module == "module3":
module3.function1()
# Other code...
if module == "module1":
module1.function2()
elif module == "module2":
module2.function2()
elif module == "module3":
module3.function2()
所以我想知道是否有更好的方法来做到这一点,例如exec(module).function1()
(这不起作用,也可能不安全......)
或者,有没有更好的方法来编码这种类型的东西?每个文件用于不同的站点,但具有相同的功能。
解决方案
如果您的字符串和模块名称不同,您可以在程序开头设置一个 dict:
import module1
import module2
modules = {
"module1": module1,
"module2": module2,
...
}
...
modules[moduleName].function1()
modules[moduleName].function2()
如果您的字符串始终与模块的名称相同,那么您可以使用importlib
:
from importlib import import_module
...
import_module(moduleName).function1()
import_module(moduleName).function2()
推荐阅读
- sql - Laravel 查询生成器。列 if not null = 1 else = 0 在 select 方法中
- python - 无法摆脱这个循环
- jquery-ui - 在更新代码时尝试理解 requirejs、shim 和依赖项
- python - Pip install 未检测到的故障模式
- azure-devops - 自托管代理上的 Azure DevOps Python Pipeline Agent.ToolsDirectory 错误
- postgis - 如何在 PostGIS 数据库中存储值网格,以便 GeoServer 对其进行轮廓化?
- asp.net-mvc - 在 ASP.NET MVC 5 中将 SQL 查询转换为 lambda 表达式
- python - 自定义默认用户模型后 /admin/login/ 的 FieldError
- mysql - 如何在 Ubuntu 中离线安装 Mysql-server
- r - XGBoost xgbTree 的插入符号 varImp 包装器是否使用 XGBoost Gain?