from story.apps.document import core
print core.submit()
这不起作用:
from story import apps
print apps.document.core.submit()
“故事” 是一个目录。里面有“应用程序”目录。里面有“文件”目录。 “core.py”是一个文件。
在每个目录中都有__init__.py
。
from story.apps.document import core
print core.submit()
这不起作用:
from story import apps
print apps.document.core.submit()
“故事” 是一个目录。里面有“应用程序”目录。里面有“文件”目录。 “core.py”是一个文件。
在每个目录中都有__init__.py
。
在第二个例子中,您只导入了包。 Python不会自动导入子包或模块。你必须明确地做到这一点,就像第一个例子。做一个dir(apps)
,你会发现它只是一个空包。
当你从故事导入应用程序做什么,你不包括里面的应用程序的所有子包,对于这一点,你这样做,
从story.apps.document进口*
的__init__.py
文件告诉python将目录解释为一个包,但它不一定告诉python从目录中导入子包或其他文件(尽管它可能会添加适当的import
语句)。
对于大包裹层次结构,通常最好要求明确导入子包裹。
这只适用于如果story/__init__.py
进口apps
。
当你做story.apps.document import core
,你告诉Python解释器来匹配描述story.apps.document
的模块,导入它,然后加载可变core
从它的命名空间到你目前的一个。
因为core
是一个文件模块,它在其文件名中定义了变量,例如submit
。
当你做from story import apps
,你告诉Python解释器来匹配描述story
的模块,导入它,然后加载可变apps
从它的命名空间到你目前的一个。
因为apps
是一个目录模块,它的名称空间变量在它的__init__.py
和该目录中的其他模块中定义。所以apps
知道document
,但它不知道任何关于document
的子模块core
。
FYI:这有时混淆人的原因是因为这样的东西...
工作得很好:
# File1
import story.apps.document
story.apps.document.core()
不起作用:
# File2
import story
story.apps.document.core() # <-- Looks like the same function call, but is an Error
对于file1
,进口的工作,因为在import
操作试图找到智能文件系统上的事情。函数调用工作,因为该模块document
是进口的,它仅仅是命名为story.apps.document
。
对于file2
,函数调用不起作用,因为点运算符没有任何智能性,它只是试图访问Python对象上的属性 - 它不知道关于文件系统或模块的任何信息。
什么可以更加迷惑人的是,如果'file1'先进口,然后'file2'就可以了(因为'file1'已经做了必要的繁重让一切正确导入) – ncoghlan 2011-03-29 03:40:53