[英]Best practice for lazy loading Python modules
有時我想在 Python 中延遲加載模塊。 通常是因為我想保持較低的運行時要求或啟動時間,並且將代碼拆分為子模塊會很麻煩。 一個典型的用例和我目前的首選實現是這樣的:
jinja2 = None
class Handler(...):
...
def render_with_jinja2(self, values, template_name):
global jinja2
if not jinja2:
import jinja2
env = jinja2.Environment(...)
...
我想知道:有沒有規范/更好的方法來實現延遲模塊加載?
您沒有理由手動跟蹤導入——VM 維護一個已導入模塊的列表,任何后續導入該模塊的嘗試都會導致在 sys.modules 中進行快速 dict 查找。
你的代碼和
def render_with_jinja2(self, values, template_name):
import jinja2
env = jinja2.Environment(...)
為零——當我們點擊那個代碼時,如果jinja2
還沒有被導入,那么它就會被導入。 如果已經存在,則繼續執行。
class Handler(...):
...
def render_with_jinja2(self, values, template_name):
import jinja2
env = jinja2.Environment(...)
...
無需緩存導入的模塊; Python 已經做到了。
其他答案已經覆蓋了實際的細節,但如果你有興趣在一個延遲加載庫,檢查出apipkg這是一部分py
包( py.test
成名)。
來自 sqlalchemy 的不錯模式:依賴注入:
@util.dependencies("sqlalchemy.orm.query")
def merge_result(query, *args):
#...
query.Query(...)
它不會在模塊頂部聲明所有“導入”語句,而是僅在函數實際需要時才導入模塊。 這可以解決循環依賴問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.