我已阅读https://peps.python.org/pep-0420/,但它没有明确声明命名空间包严格只允许在顶层。所有示例都将命名空间包显示为顶级包。
这可行吗(package1 和 package2 分布在单独的包中)?
package1/
+-- foo/
+-- __init__.py
+-- bar/
+-- baz.py
package2/
+-- foo/
+-- bar/
+-- zoq.py
在上面的例子中,“foo”是一个常规包,“foo/bar”是一个命名空间包。我认为答案应该是“否”,因为“foo”有两个不同的角色,但我可能是错的。
(这个问题的一个原因是如果
foo/__init__.py
被广泛使用,将其转换为命名空间包会引起很大的头痛。)
常规包可以包含命名空间包,但这没什么意义。你的例子不会起作用。
命名空间包可以拆分为多个目录,但每个目录都必须是其“父路径”中列出的目录的子目录。当命名空间包是另一个包的子包时,父路径是父包的
__path__
。
当父包是普通包时,其
__path__
只有一个条目。命名空间包被允许“分割”在......恰好一个位置,完全否定了任何好处。
从您的示例中不清楚
foo
是否是顶级包,或者您是否确实拥有 package1.foo
和 package2.foo
包。如果您有一个 foo
顶级包,则导入系统会将第一个 foo
目录识别为该包的位置,并完全忽略第二个 foo
目录。
如果您有
package1.foo
和 package2.foo
软件包,那么它们是独立的软件包,彼此无关。 package2.foo
和 package2.foo.bar
将是命名空间包,但 package2.foo.bar
将与 package1.foo.bar
没有任何联系 - 它不会被视为跨两个目录的单个 foo.bar
命名空间包。