2024-06-06 15:26:50 发布
网友
这是有效的:
from story.apps.document import core print core.submit()
这不起作用:
from story import apps print apps.document.core.submit()
“故事”是一个目录。里面有“apps”目录。里面有“文档”目录“core.py”是一个文件。
每个目录中都有一个__init__.py。
__init__.py
当你从story import应用程序中执行时,你不会将所有子包都包含在应用程序中,为此,你会执行如下操作:
从story.apps.document import*
当您执行story.apps.document import core操作时,您告诉Python解释器匹配描述的模块story.apps.document,导入它,然后将变量core从其名称空间加载到当前名称空间中。
story.apps.document import core
story.apps.document
core
因为core是一个文件模块,它的名称空间变量在该文件中定义,例如submit。
submit
当您执行from story import apps操作时,您告诉Python解释器匹配描述的模块story,导入它,然后将变量apps从其名称空间加载到当前名称空间中。
from story import apps
story
apps
因为apps是一个目录模块,它在其__init__.py中定义的命名空间变量和该目录中的其他模块中都有。所以apps知道document,但它不知道document的子模块core。
document
仅供参考:这有时让人困惑的原因是这样的事情。。。
工作正常:
# 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。
file1
import
对于file2,函数调用不起作用,因为dot运算符没有任何智能,它只是试图访问Python对象上的属性——它对文件系统或模块一无所知。
file2
__init__.py文件告诉python将目录解释为包,但它不一定告诉python从目录中导入子包或其他文件(尽管它可能会,如果您添加了适当的import语句)。
对于大型包层次结构,通常最好要求显式导入子包。
当你从story import应用程序中执行时,你不会将所有子包都包含在应用程序中,为此,你会执行如下操作:
从story.apps.document import*
当您执行
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
。仅供参考:这有时让人困惑的原因是这样的事情。。。
工作正常:
不起作用:
对于
file1
,导入工作是因为import
操作试图智能地查找文件系统上的内容。函数调用之所以起作用,是因为模块document
是导入的,而它只是命名为story.apps.document
。对于
file2
,函数调用不起作用,因为dot运算符没有任何智能,它只是试图访问Python对象上的属性——它对文件系统或模块一无所知。__init__.py
文件告诉python将目录解释为包,但它不一定告诉python从目录中导入子包或其他文件(尽管它可能会,如果您添加了适当的import
语句)。对于大型包层次结构,通常最好要求显式导入子包。
相关问题 更多 >
编程相关推荐