您应该知道的第一件事是 Python 语言不是 ISO 标准。这与 C/C++ 有很大不同,这意味着没有“正确”的方式来定义语言行为 - CPython 可能会因为以这种方式编码而执行某些操作,而 Jython 可能会执行相反的操作。
关于您的问题,请记住“导入”模块是一个由两部分组成的操作:首先加载模块 - 如果从未加载过,例如如果它在 sys.modules 中不可用,则名称将绑定到本地命名空间中的该模块。
hence:
1)是的,您可以通过提供适当的命名空间来引用模块 a 中您想要的任何内容,例如你必须做类似的事情
BC 名称 =“某事”
我认为这在 Python 程序中很少这样做,并且可能被认为是不好的做法,因为它强制了“传递依赖” - 如果某些模块 B 实现被重构并且不再依赖于 C,它应该继续提供 C 模块为了满足 A 部门的要求。
当然,设置 __ all __ 可以防止这种情况,一个好的做法可能是将 __ all __ 放在所有模块中,然后导出just您希望真正公开的符号。
2)是和否。正在做
import a.b.c.d
执行first在所有模块上导入阶段(加载),但第二个阶段仅在 a 上(以及递归地在 b 中相对于 c 等),但链中的所有模块必须由完整名称空间引用;在这样的导入之后,你可以做
a.something
a.b.something
a.b.c.something
但你不能这样做
c.something
b.something
我必须承认这种用法也很少见;我通常更喜欢“从模块导入某些东西”的导入方式,通常你只需要询问你需要什么 - 这种嵌套在库中既不常见,它的用法也不常见。
很多时候,存在“外部包”,仅用于组织,其中包含带有类的模块。上面的a、b、c很可能只是包,而d是一个真正包含类、函数和其他对象的模块。所以正确的用法是:
from a.b.c.d import name1, name2, name3
我希望这能满足您的好奇心。