2016-01-29 2 views
1

я следующая структура файлов конфигурации:импорта Python Lib аналог «импорт * от XXX»

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 «s) и загрузите соответствующие настройки.

Я знаю только об импорте с 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 ... 

Есть ли способ сделать что-то похожее на выражение питона: from config.${RUNTIME_ENV}.settings import *?

ответ

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.

Смежные вопросы