2012-04-10 55 views
4

我想了解一些與設計有關的事情。爲什麼Lazy Import在Python中不是默認的?

我看到了許多使用Lazy Import功能的代碼。懶惰導入是指支持「LazyImport」風格的某些配方,包和模塊提供的工具。這些實現通常旨在僅在使用模塊時才導入模塊,併爲不同的事物提供一些額外的鉤子。我知道那裏的錯誤條件延遲了,但我想了解爲什麼Lazy Import不是Python中的默認策略。

它(其他)的缺點是什麼可以阻止它做出一個一般的有用的案例。或者是否有使用這種語言作爲默認導入機制策略的語言。

回答

4

這裏的慵懶進口的例子在python:

def xmlfrobnicator(xmlstr): 
    from lxml import etree 

    # do whatever 

它不常用,因爲它對於大多數程序提供了非常少的優勢 - 一旦加載,加載模塊(除非你採取措施卸載) ,並且很少有一個很少使用的依賴項,只有在使用時才加載它是值得的。

我想你可能一直在尋找JavaScript,其中程序可能只運行很短的時間,並沒有使用他們的所有功能,即使他們這樣做,模塊的後臺加載也會提高用戶感知的速度。

+1

誰使用LazyImport的人說,他們「有一個用於如此罕見,僅加載它在使用時的依賴是值得的」 - 我看着提供LazyImport像PEAK的導入實現 - 看起來很好,一點也不復雜。 – 2012-04-10 07:42:35

+0

@SenthilKumaran如果你不想聽到答案,不要問這個問題。正如你在你的問題中注意到的,大多數python用戶不使用延遲導入,這就是我給出的原因。 – Marcin 2012-04-10 07:44:54

+0

你好馬爾辛 - 我並不是在粗魯。事實上,我不得不使用LazyImport的幾個軟件包,我不得不繞過它。現在我明白了,我問爲什麼不是默認值。 (我試圖理解技術上的缺陷,如果有的話) – 2012-04-10 07:47:43

4

Python,不像例如PHP很少用於每個請求/動作/ ...導致整個應用程序重新啓動的方式。
因此,在啓動時導入所有內容的好處是無需執行導入,而應用程序正在做一些延遲煩人的事情。
本地/懶惰導入的唯一優點是您不會遇到循環導入問題。

+0

本地化導入是一回事。 PEAKS導入工具包如LazyImport工具如何? – 2012-04-10 07:44:09

+0

@SenthilKumaran這個問題的重點是促進PEAKS嗎? – Marcin 2012-04-10 07:46:09

+0

@Marcin - 不,請。不要誤解。 – 2012-04-10 07:48:30

1

有時模塊會在第一次加載時執行重要的事情,所以它可能會中斷程序以延遲導入模塊。例如,如果一個模塊定義了程序第一次啓動時應該解析的命令行標誌,則在解析參數之前必須導入該模塊。由於Python最初被設計爲熱切地進行導入,現在不可能在不破壞某些現有程序的情況下更改默認行爲。另外,正如其他一些答案中提到的那樣,對於長期運行的服務,通常需要在提供請求之前先加載所有內容,以便前幾個請求不會減慢,等待模塊導入。

相關問題