2013-06-29 27 views
6

說我有兩個Python模塊:Python的禮儀:導入模塊

module1.py

import module2 
def myFunct(): print "called from module1" 

module2.py

def myFunct(): print "called from module2" 
def someFunct(): print "also called from module2" 

如果我輸入module1,豈不是更好禮儀重新導入module2,或只是將其稱爲module1.module2

例如(someotherfile.py):

import module1 
module1.myFunct() # prints "called from module1" 
module1.module2.myFunct() # prints "called from module2" 

我也可以這樣做:module2 = module1.module2。現在,我可以直接撥打module2.myFunct()

不過,我可以改變module1.py到:也

import module1 
module1.myFunct() # prints "called from module1"; overrides module2 
module1.someFunct() # prints "also called from module2" 

,通過導入*,幫助( '模塊1')顯示所有:

from module2 import * 
def myFunct(): print "called from module1" 

現在,在someotherfile.py,我能做到這一點來自module2的功能。

在另一方面,(假設module1.py使用import module2),我可以這樣做: someotherfile.py

import module1, module2 
module1.myFunct() # prints "called from module1" 
module2.myFunct() # prints "called from module2" 

再次,這是更好的禮儀和實踐?要再次輸入module2,還是隻想參考module1的輸入?

回答

2

只是import module2。由於Python在sys.modules中緩存模塊對象,重新導入相對來說成本較低。

此外,如module1.module2.myFunct中的鏈接點違反了Law of Demeter。也許有一天,你會想要替換module1與其他模塊module1a哪些不導入module2。通過使用import module2,您將避免必須重寫所有出現的module1.module2.myFunct

from module2 import *通常是一種不好的做法,因爲它很難追蹤變量的來源。混合模塊名稱空間可能會產生變量名稱衝突。例如,from numpy import *是一個確定的否定,因爲這樣做會覆蓋Python的內建sum,min,max,any, all,abs,round

3

引述PEP 8 style guide

當導入從一個包含類模塊類,它通常是好拼寫這樣的:

from myclass import MyClass 
from foo.bar.yourclass import YourClass 

如果拼寫引起局部名字衝突,然後拼出它們

import myclass 
import foo.bar.yourclass 

強調我的。

請勿使用module1.module2;您正在依靠module1的內部實現細節,該細節稍後可能會更改它正在使用的導入。您可以直接導入module2,這樣做除非模塊作者另有說明。

可以使用__all__ convention來限制從與from modulename import *模塊進口的; help()命令也會列出該列表。清單名稱您明確導出__all__幫助清理help()文本表示:

公共名由模塊定義的通過檢查模塊的名稱空間名爲__all__變量確定;如果定義了它,它必須是由該模塊定義或導入的名稱的字符串序列。 __all__中給出的名稱都被認爲是公開的,並且必須存在。如果未定義__all__,則公用名稱集合將包含模塊名稱空間中的所有名稱,該名稱不以下劃線字符開頭('_')。 __all__應該包含整個公共API。它旨在避免意外導出不屬於API的項目(例如在模塊中導入和使用的庫模塊)。