2010-04-26 124 views
38

Python是否存在包的命名约定,如Java的com.company.actualpackage?大多数时候我看到简单的,可能碰撞的软件包名称,如“web”。Python包名称约定

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

回答

35

Python有两个 “咒语”,涵盖这个话题:

明确优于隐式。

命名空间是一个鸣喇叭伟大构想 - 让我们做更多的这些!

The Python Style Guide(PEP 8)中可以找到模块的命名和导入约定。

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

一个与Java的问题是它强迫你重复自己,不断的。有很多模板可以用于Java代码,而这在Python中并不是必需的。 (getter/setter方法是这方面的一个典型的例子。)

命名空间是没有这么多Python中的一个问题,因为你可以在导入时给模块的别名。如:

import com.company.actualpackage as shortername 

所以,你不仅能够创建或操纵你的程序中的命名空间,但是能够创建自己的按键节能别名也。

+4

+1与'as'关键字的别名 – n611x007 2013-05-09 11:35:36

1

我一直在使用python多年,我已经看到了从后起之秀新的开发尝试命名文件“xml.py”碰撞的99.9%。我可以看到Java方案的一些优点,但大多数开发人员都足够聪明,可以选择合理的程序包名称,所以它确实不是什么大问题。

+0

的“xml.py”的问题(命名一个脚本,不小心隐藏了内置模块)是由脚本被模块*和*所查找模块脚本的目录,比非显而易见的名字更加引起的。命名脚本'xml.py'的人通常不会期望它被导入'import xml'。 – 2010-04-26 13:55:42

+1

有经验的开发人员不会命名脚本'xml.py'并期望执行'import xml',但我清楚地表明这对新开发人员来说是一个问题。 – mikerobi 2010-04-26 15:09:09

5

的原因有一般不包层次是因为Python包不容易扩展的方式。包是实际的目录,虽然你可以让包看起来在多个子目录中(通过将目录添加到包的列表中),但这不方便,而且很容易做错。至于为什么 Python包不容易以这种方式扩展,好吧,这是一个设计选择。圭多不喜欢深层次的结构(现在仍然没有),也不认为他们是必要的。

的约定是挑选这是显而易见的,但唯一的项目一个顶层包名称 - 例如,项目本身的名称。不管你想要什么,你都可以把它里面的所有东西都组织起来。(因为你是在控制它)。把包分成独立的所有者是多一点工作,但是有一些指导是可能的。这很少需要。

13

Java的约定也有它自己的缺点。并非每个开源软件包都有一个稳定的网站。如果维护人员的网站更改,应该怎么做?而且,使用这个方案的软件包名称会变得很长且很难记住。最后,包的名称应该代表包的目的,而不是它的主人

+0

+1完全同意 – 2010-04-26 14:04:54

+0

使用域名的原因是在项目所有者的控制下使用名称空间。但是,如果网站与软件包名称不同,这将会令人困惑... – deamon 2010-04-26 14:14:25

+1

@deamon答案中的问题是如果您没有您控制的域名,您会做什么 - 这对许多个人来说都是如此 – Mark 2010-04-26 17:03:30

7

没有为Python包没有类似Java的命名约定。你当然可以为你自己开发的任何软件包采用一个,但是你可能必须侵入性地编辑你可能从第三方采用的任何软件包,而且“文化上的异形”命名约定可能会削弱你自己的软件包的变化被广泛采用在你的组织之外。从技术上讲,Java在Python中的约定没有什么问题(它只会使一些from陈述更长一些,没什么大不了的),但实际上文化方面使它几乎不可行。

3

没有什么能阻止你使用约定,如果你想要的,但它不是在所有在Python世界标准,你可能会得到搞怪的表情。当它们深深地嵌套在com中时,关注管理包并没有什么乐趣。

这听起来可能马虎的人从Java的到来,但实际上它并没有真正似乎造成任何大的困难,甚至是很差命名为web.py.包

的地方,你经常做实践 GET命名空间冲突是相对进口:其中代码package.module1试图import module2并有既有package.module2和标准库module2(其中有通常被作为STDLIB大和增长)。幸运的是,模糊的相对进口are going away

+1

Ehm,考虑到必须明确打开绝对导入,有意无意进行绝对导入而不是偶然导入相对导入。另一个常见的问题是:试图从包含同名模块的包中导入stdlib模块。这不是由于缺少包层次结构(因为你在那里包中)而导致的,而是Python在3.x中的隐式相对导入。 – 2010-04-26 13:59:01

+0

啊,是的,同意......重新措辞。 – bobince 2010-04-26 14:01:47

2

对谁比谁来寻找这方面的更新:

截至2012年,PEP 423地址此。 PEP 8简要介绍了该主题,但只是说:全部小写或下划线。

它的要点:挑选那些尚未PyPI上使用的难忘,有意义的名称。