簡體   English   中英

Python導入lib模擬到“從XXX導入*”

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM