Python包名称约定

dea*_*mon 49 python namespaces packages naming-conventions

像Java这样的Python有包命名约定com.company.actualpackage吗?大多数时候,我看到简单的,可能相互冲突的包名称,如" web ".

如果没有这样的惯例,是否有理由呢?您如何看待在Python世界中使用Java命名约定?

jat*_*ism 41

Python有两个"咒语",涵盖了这个主题:

显式优于隐式.

命名空间是一个很棒的主意 - 让我们做更多的事情吧!

有一个用于命名和导入模块的约定,可以在Python样式指南(PEP 8)中找到.

没有这种约定的最大原因是以Java风格一致地为模块名称加上前缀,因为随着时间的推移,你最终会在代码中重复进行大量重复,而这些重复实际上并不需要存在.

Java的一个问题是它会迫使你不断地重复自己.Java代码中有很多样板,只是在Python中不是必需的.(Getters/setters就是其中的一个主要例子.)

命名空间在Python中不是一个问题,因为您可以在导入时为模块提供别名.如:

import com.company.actualpackage as shortername
Run Code Online (Sandbox Code Playgroud)

因此,您不仅可以在程序中创建或操作命名空间,还可以创建自己的击键节省别名.


小智 17

Java的约定也有其自身的缺点.并非每个开源软件包都有一个稳定的网站.如果他的网站发生变化,维护者应该怎么做?此外,使用此方案包名称变得冗长且难以记住.最后,包的名称应该代表包的目的,而不是它的所有者

  • @deamon 答案中的问题是,如果您没有自己控制的域名,您该怎么办 - 这对许多人来说都是如此 (2认同)
  • 这不是问题。使用 Maven 和 Gradle,您始终知道从哪里获取 projectX 包。版本 1 可能是 org.place1,版本 2 可能是 com.startup.projectX,等等...我最近 2 个月一直在做 Python 编程,我已经发现至少 10 个项目的名称冲突,所以他们不得不更改名称因为这个。使用 tld.domain.etc 模式你可以很好地避免这种情况。 (2认同)

Ale*_*lli 7

Python包没有类似Java的命名约定.您当然可以为自己开发的任何软件包采用一个软件包,但是您可能需要有机地编辑您可能从第三方采用的任何软件包,并且"文化外来的"命名约定可能会削弱您自己的软件包的更改以便被广泛采用在您的组织之外.

从技术上讲,Java在Python中的约定没有任何问题(它只会使一些from语句更长,没什么大不了),但在实践中,文化方面使得它几乎不可行.


Tho*_*ers 5

通常没有包层次结构的原因是因为Python包不容易以这种方式扩展.包是实际的目录,虽然你可以让包在子目录的多个目录中查找(通过将目录添加到__path__包列表中),但这样做并不方便,而且容易做错.至于为什么 Python包不能以这种方式轻松扩展,那么这就是设计选择.Guido不喜欢深层次的(但仍然没有)并且不认为它们是必要的.

惯例是选择一个对项目来说显而易见但独特的顶级包名称 - 例如,项目本身的名称.您可以根据需要构建其中的所有内容(因为您可以控制它.)将包拆分为具有不同所有者的单独位,这是一项更多的工作,但有一些指导原则是可能的.这很少需要.


Tom*_*Tom 5

针对其他任何人的更新:

截至2012年,PEP 423致力于解决此问题。PEP 8简短地谈到了该主题,但只能说:所有小写或下划线。

要点是:选择PyPI上尚未使用的令人难忘的有意义的名称。