簡體   English   中英

延遲加載 Python 模塊的最佳實踐

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

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