java - 为什么像 Java 这样的语言使用分层包名,而 Python 不使用?

标签 java python package

<分区>

我没有用 Java 做过企业工作,但我经常看到 reverse-domain-name package naming convention .例如,对于 Stack Overflow Java 包,您可以将代码放在包 com.stackoverflow 下。

我刚刚遇到一个使用类 Java 约定的 Python 包,我不确定支持和反对它的论据是什么,或者它们是否以与 Java 相同的方式适用于 Python。您偏爱其中一个的原因是什么? 这些原因是否适用于所有语言?

最佳答案

Python 不会这样做,因为你最终会遇到一个问题——谁拥有“com”包,几乎所有其他东西都是它的子包? Python 建立包层次结构(通过文件系统层次结构)的方法根本不符合这个约定。 Java 可以摆脱它,因为包层次结构是由提供给“package”语句的字符串文字的结构定义的,因此不需要在任何地方都有一个显式的“com”包。

还有一个问题是,如果您想公开发布一个包但没有适合加入包名称的域名,或者如果您最终更改(或丢失)了您的域名一些原因。 (以后的更新需要不同的包名称吗?您怎么知道 com.nifty_consultants.nifty_utility 是 com.joe_blow_software.nifty_utility 的更新版本?或者,相反,您怎么知道它不是更新版本?如果你错过了你的域名更新,域名被域名营员抢走了,其他人从他们那里购买了这个域名,他们想要公开发布软件包,他们是否应该使用你已经使用过的同一个域名? )

域名和软件包名称,在我看来,解决的是两个完全不同的问题,有着完全不同的复杂因素。我个人不喜欢 Java 的约定,因为(恕我直言)它违反了关注点分离。避免命名空间冲突固然很好,但我讨厌我的软件的命名空间由(并依赖于)营销部门与某些第三方官僚机构的交互来定义的想法。

为了进一步澄清我的观点,回应 JeeBee 的评论:在 Python 中,包是一个包含 __init__.py 文件(可能还有一个或多个模块文件)的目录。包层次结构要求每个更高级别的包都是完整的、合法的包。如果两个包(尤其是来自不同供应商的包,但即使是来自同一供应商的不直接相关的包)共享一个顶级包名称,无论该名称是“com”、“web”或“utils”或其他名称,每个包必须为该顶级包提供一个__init__.py。我们还必须假设这些包很可能安装在目录树中的相同位置,即 site-packages/[pkg]/[subpkg]。因此,文件系统强制只有一个 [pkg]/__init__.py——所以哪一个获胜?该问题没有(也不可能)一般情况下的正确答案。我们也不能合理地将这两个文件合并在一起。因为我们不知道另一个包可能需要在那个 __init__.py 中做什么,所以不能假设共享顶级包的子包在安装两个时都可以工作,除非它们被专门编写为兼容彼此(至少在这个文件中)。这将是一个分发噩梦,并且几乎会使嵌套包的整个点无效。这不是特定于反向域名包层次结构,尽管它们提供了最明显的坏例子并且(IMO)在哲学上值得怀疑——这实际上是共享顶级包的实际问题,而不是哲学问题,那是我主要关心的是这里。

(另一方面,使用子包更好地组织自身的单个大包是一个好主意,因为这些子包是专门为一起工作和生活而设计的。这在 Python 中并不常见,虽然,因为单个概念包往往不需要足够多的文件来需要额外的组织层。)

关于java - 为什么像 Java 这样的语言使用分层包名,而 Python 不使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/709036/

相关文章:

java - 无法使用 XML 配置运行第一个 spring 程序。我收到这个错误

java - 如何声明一个ArrayList?

python - 我如何获得 Pandas 中一行的相等或最接近的值?

python - 按列比较不同的 pandas 数据框与公差变化

caching - 在 nuget 命令工具中使用 -verbosity 和 -version 抑制详细输出

python - python 需要 __init__.py 包的原因是什么?

java - 如何创建在动态位置使用外部 jar 文件的可运行 jar

python - 在python中合并堆模块中的元组

python - 如何导入已从父脚本导入的库?

java - 我怎样才能使这段代码最终打印一条语句来告诉是否至少有一个匹配项或文件不存在?