Python导入lib类似于"导入*来自XXX"

时间:2016-01-29 21:55:45

标签: python

我有以下配置文件的结构:

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 *

1 个答案:

答案 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