我有以下配置文件的结构:
app
\config
\development
\__init__.py
\settings.py
\app_config.py
\production
\__init__.py
\settings.py
\app_config.py
\testingpy
\settings.py
\app_config.py
\settinngs.py
\app_config.py
实际上app.config.settings
只检查环境变量RUNTIME_ENV
(可能是development|production|testing
,相当于config
个子文件夹之一)并加载相应的设置。< / p>
我只知道用importlib
导入哪个模块作为局部变量返回给我模块,我强迫写这样的东西:
SCALA_URL = imported_settings.SCALA_URL
REDIS_URL = imported_settings.REDIS_URL
SOME_SETTINGS_VAR = imported_settings.REDIS_URL
.... tons of duplicated strings here, i.e. variables names are the same ...
有没有办法做类似于python的表达式:from config.${RUNTIME_ENV}.settings import *
?
答案 0 :(得分:2)
globals()
的返回值是可变的。你可以这样做:
imported_foo = importlib.import_module('foo')
globals().update(vars(imported_foo))
请注意,这会将带下划线前缀的内容导入全局命名空间。如果要排除这些,请编写仅包含所需内容的字典理解。例如:
globals().update({name: value
for name, value in vars(imported_foo).items()
if not name.startswith('_')})
此无效 locals()
,返回只读值。这样做是不合理的(import *
到非全局命名空间),因为Python必须在编译时知道所有局部变量的名称,以便在...中生成正确的LOAD_FOO
指令。字节码(以及各种其他有趣的问题,例如识别closure捕获的变量)。您会发现import *
在函数或类中是非法的:
>>> def foo():
... from foo import *
...
File "<stdin>", line 1
SyntaxError: import * only allowed at module level
>>>
这不仅仅是“import *
糟糕的设计问题”。这是一个基本的语言限制,无法使用importlib
。