2012-04-26 77 views
1

如何導入python類但避免在該模塊中運行import語句?從模塊導入Python類但不依賴關係

Module foo 
    from bar import A 

Module bar 
    import alpha 

    class A(object): 
     ... 

    class B(objects): 
     ... 

我要進口A級,但不需要B類需要在模塊條import語句爲B類,但我想避免,如果需要可以安裝這種依賴性,如(我假設)它將被加載到內存中但不被使用。

任何幫助,將不勝感激。

回答

3

您無法停止bar從導入alpha而沒有黑客入侵其來源。但你可以「欺騙」 alpha,由它寫入sys.modules

>>> import alpha 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: No module named alpha 
>>> import sys; sys.modules['alpha'] = object() 
>>> import alpha 
>>> 

這工作,因爲Python的高速緩存中sys.modules導入的模塊,因此,如果您導入兩次的東西你不必去通過所有的硬第二次工作。將alpha添加到它意味着Python認爲您已經導入了alpha,因此當bar嘗試這樣做時,它只會取回緩存的副本。

顯然,您應該仔細考慮您是否適合這樣做 - bar如果在任何地方實際使用alpha都會以意想不到的方式崩潰。

+6

這是一個很好的點,但它會在淚水有可能最終遲早... – 2012-04-26 09:34:32

+0

感謝 - 我試圖使用sys.modules,但沒有意識到我必須做一個導入 – alan 2012-04-26 15:39:08

+0

@alan一個好的經驗法則是,__你需要定義每個變量___。例如,除非您告訴Python「我希望'sys'表示stdlib中的模塊」,而您使用'import sys'完成,否則'sys'不代表任何內容。 – katrielalex 2012-04-26 16:56:38

1

把進口在B類的init

class B: 
    def __init__: 
     import alpha 

如果我不是弄錯這可能工作

+1

如果在B方法中使用alpha或在B方法或B方法中使用裝飾器,則不適用。 – 2012-04-26 09:36:03

+0

事實上,這會將'alpha'的範圍限制在'__init__'中,因此無法在其他地方引用它。 – katrielalex 2012-04-26 09:38:46