2012-04-07 97 views
5

我正在讀sourcode爲Python項目和整個下面的行來了:Python的導入對象的一個​​模塊中的源於不同的模塊到第三模塊

from couchexport.export import Format 

(來源:https://github.com/wbnigeria/couchexport/blob/master/couchexport/views.py#L1

我去了couchexport/export.py看看Format是什麼(Class?Dict?別的?)。不幸的是Format不在該文件中。 export.py確實從couchexport.models導入Format,其中 a Format類(來源:https://github.com/wbnigeria/couchexport/blob/master/couchexport/models.py#L11)。

當我在我的IDE中打開原始文件並讓它查找聲明時,我在本問題開始時提到了它,它直接導致了models.py。

發生了什麼事?如何從一個文件導入(export.py)實際上是從另一個文件導入(models.py)而未明確說明?

回答

16

如果模塊a做了from b import Foo,然後Fooa事後成員和a.Foo訪問。因此,您現在可以使用from a import Foo導入它。

這是常用的,如果你有一個大型圖書館跨多個文件分佈,並希望他們可以從一個單一的位置訪問。比方說,你有一個包foo具有以下佈局:

foo/ 
    a.py 
    b.py 
    c.py 
    __init__.py 

a.pyb.pyc.py,定義類A,分別BC

如果你想使用這些類,你通常需要編寫

from foo.a import A 
from foo.b import B 
from foo.c import C 

這至少有兩個問題:

    需要對這個簡單的
  1. 多的代碼(三線)導入
  2. 之後,庫作者現在不能再更改文件/類關聯,因爲這會破壞現有的代碼。

所以通常你只要把在__init__.py如下:

from a import A 
from b import B 
from c import C 

現在你把所有的作品一起在一個地方,所有的類都可以訪問一個進口:

from foo import A,B,C 
+0

我不確定#1說什麼問題。 – DSM 2012-04-07 11:15:56

+0

@DSM:澄清:) – 2012-04-07 11:26:54

+0

我認爲這可能是一個未翻譯的習慣用語,但由於'type'意味着Python中的某些東西,所以我不確定。 :^) – DSM 2012-04-07 11:30:17