[英]Python import lib analogue to “import * from 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
的子文件夾之一)並加載相應的設置。
我只知道使用importlib
進行導入,而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 *
嗎?
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
指令(以及各種其他有趣的問題,例如識別閉包捕獲的變量)。 您會發現import *
在函數或類中是非法的:
>>> def foo():
... from foo import *
...
File "<stdin>", line 1
SyntaxError: import * only allowed at module level
>>>
這不僅僅是“ import *
是不良設計”的問題。 這是基本的語言限制,不能與importlib
一起使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.