Python包名称约定

是否有像Java的com.company.actualpackage一样的Python命名约定? 大多数情况下,我看到简单的,可能碰撞包名称,如“ networking ”。

如果没有这样的约定,是有原因的吗? 你如何看待在Python世界中使用Java命名约定?

Python有两个涵盖这个主题的“mantras”:

显式比隐式更好。

命名空间是一个好主意 – 让我们做更多的!

在Python风格指南 (PEP 8)中可以find模块命名和导入的约定。

没有这样的约定来一致地在Java风格的前缀模块名称的最大原因是,随着时间的推移,你最终会在你的代码中重复很多,并不需要在那里。

Java的一个问题是它迫使你不断重复自己。 Python代码中有很多模板不在Python中。 (Getters / setter是一个很好的例子。)

命名空间在Python中并不是什么大问题,因为你可以在导入时给模块一个别名。 如:

 import com.company.actualpackage as shortername 

所以你不仅能够创build或者操作你的程序中的命名空间,而且能够创build你自己的按键保存别名。

Java的惯例也有它自己的缺点。 并不是每个开源软件包都有一个稳定的网站。 如果维护人员的网站发生变化,应该怎么做? 另外,使用这个scheme的软件包名字变得很长,很难记住。 最后,包装的名称应代表包装的目的,而不是包装的所有者

Python包没有像Java一样的命名约定。 你当然可以为你自己开发的任何软件包采用一个,但是你可能必须侵入性地编辑你可能从第三方采用的任何软件包,而“文化上的外来”命名约定可能会缩小你自己的软件包的变化以被广泛采用在你的组织之外。

从技术上说,Python的Java惯例没有什么问题(只会让一些语句稍微长一些,没有什么大不了的),但实际上文化方面使它几乎不可行。

通常没有包层次结构的原因是因为Python包不容易以这种方式扩展。 包是实际的目录,尽pipe你可以让包看起来在多个子目录中(通过将目录添加到包的__path__列表中),但是这样不方便,而且很容易做错。 至于为什么 Python包不能轻易地扩展,那么这就是deviseselect。 Guido不喜欢深层次的结构(现在仍然没有),也不认为他们是必要的。

约定是select一个顶级的包名,这个名字很明显,但是对于你的项目来说是唯一的 – 例如项目本身的名字。 不pipe你想要什么,你都可以把它里面的所有东西都组织起来(因为你是在控制它)。把这个包拆分成不同的所有者是多一点的工作,但是有一些指导是可能的。 这很less需要。

如果你愿意的话,没有什么能够阻止你使用这个约定,但是在Python世界里它并没有达到标准,你可能会看起来很有趣。 当他们深深地嵌套在com上时,关心pipe理软件包并没有多大的意义。

对于来自Java的用户来说听起来可能不太合适,但实际上它并没有造成什么大的困难,即使是与web.py一样的软件包也是如此。

在实际中,经常遇到命名空间冲突的地方是相对导入:其中package.module1中的代码尝试import module2并且标准库中包含一个package.module2和一个module2 (这通常与stdlib一样大,生长)。 幸运的是,模糊的相对import正在消失 。

任何其他谁来寻找这个更新:

截至2012年, PEP 423解决了这个问题。 PEP 8简要介绍了这个话题,但只是说:全部小写或下划线。

它的要点:selectPyPI上尚未使用的令人难忘的有意义的名称。

我已经使用了python多年,99.9%的碰撞是从新开发者尝试命名文件“xml.py”而来的。 我可以看到Javascheme的一些优点,但大多数开发人员都足够聪明,可以select合理的软件包名称,所以它确实不是什么大问题。