常规Python包可以包含命名空间包吗?

问题描述 投票:0回答:1

我已阅读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
被广泛使用,将其转换为命名空间包会引起很大的头痛。)

python package namespaces
1个回答
0
投票

常规包可以包含命名空间包,但这没什么意义。你的例子不会起作用。

命名空间包可以拆分为多个目录,但每个目录都必须是其“父路径”中列出的目录的子目录。当命名空间包是另一个包的子包时,父路径是父包的

__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
命名空间包。

© www.soinside.com 2019 - 2024. All rights reserved.