2012-04-07 64 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