2009-12-27 150 views
1

在我工作的Python目錄創建:爲什麼我不能調用packagename.modulename.foo()?

packagename/__init__.py 
packagename/modulename.py 
test.py 

在modulename.py我創造了一些空的類:

class Someclass(object): 
    pass 

在test.py:

import packagename 
packagename.modulename.Someclass() 

爲什麼我可以」在test.py中調用packagename.modulename.someclass()?

AttributeError: 'module' object has no attribute 'modulename' 

我的理解是正確的做法是:

import packagename.modulename 

from packagename import modulename 

但我不明白爲什麼我在我的情況下,出現此錯誤。

更新:

換句話說,有沒有辦法導入包的內容與在不同的命名空間中的所有模塊? 我需要正確的Python的表達式爲:

from packagename import * as mynamespace 

回答

1

如果「packagename」包中包含100個模塊,那麼當您只導入頂級名稱時是否要自動導入它們?這通常不是一個好主意,所以Python不會這樣做。

如果你想有一個特定的模塊自動導入,只是將其包含在__init__.py像這樣:

from packagename import modulename 

另外,使用Python 2.5或2.6:

from __future__ import absolute_import 
from . import modulename 

(在以後的版本中,你可以溝from __future__部分。)

編輯:有沒有內置機制來要求Python在包內導入所有可能的子模塊。這不是一個常見的用例,並且通過使您的__init__.py精確導入那些您想要的內容,可以更好地處理它。將某些東西放在一起可以完成這項工作(使用__import__()等),但在大多數情況下,只需按照所述的方式顯式導入所有子模塊就更好了。

+0

我需要在packagename/__ init_.py中列出所有軟件包的模塊,對不對? 我想我需要正確的python表達式「from packagename import * as mynamespace」。 – Alex 2009-12-27 22:14:41

+0

我認爲這就是'將包名稱導入mynamespace'。 – 2009-12-28 00:40:50

0

一些包是非常大的和進口的一切內他們將花費大量的時間。爲進口提供精細的粒度會更好,因此用戶只能導入他真正需要的內容。

2

Python不會自動遞歸併導入子包。當你說:

import packagename 

這就是所有它導入。如果你說:

import packagename.modulename 

然後第一進口packagename,然後導入packagename.modulenameassignes對它的引用作爲packagename屬性。因此,當你在代碼中說:

packagename.modulename.Someclass() 

Python是隻用100%正常屬性查找。首先在當前命名空間中查找packagename變量。然後查找packagename對象的modulename屬性。然後查找modulename對象的Someclass屬性。

如果你忽略導入packagename.modulename,那麼顯然是packagename沒有屬性稱爲modulename,從今以後的AttributeError

我建議你彈出命令行並導入一些東西,然後用dir()來檢查它。然後導入一個子包,並再次使用dir()。你會很快看到差異。


最後,語法:

from packagename.modulename import SomePackage 

在本質上是一樣的:

import packagename.modulename 
SomePackage = packagename.modulename.SomePackage 

(當然,它的實現方式不同,但或多或​​少相同的結果)。

這有幫助嗎?

+0

@gahooa:謝謝你的回答,但有什麼辦法可以從單獨的命名空間中導入包中的所有模塊嗎?就像「import packagename。*」 – Alex 2009-12-27 21:17:26

相關問題