Python核心库与PEP8

5 投票
3 回答
929 浏览
提问于 2025-04-16 12:42

我在试图理解为什么大家说Python是一种优美的语言时,发现了PEP 8这个东西……但我觉得有点奇怪。实际上,它说你可以使用任何命名规则,只要保持一致就行……然后我在核心库中发现了一些奇怪的地方:

request()
getresponse()
set_debuglevel()
endheaders()
http://docs.python.org/py3k/library/http.client.html

下面这些函数是在Python 3.1中新增的。那么这里用到了PEP 8的哪些规则呢?

popitem()
move_to_end()
http://docs.python.org/py3k/library/collections.html

所以我想问的是:PEP 8在核心库中有用吗?为什么会这样?
是不是像PHP那样,我不能仅仅记住函数的名字,因为可能有很多种写法?

为什么即使是新的函数,核心库中也没有使用PEP 8的规则呢?

3 个回答

2

Python的标准库管理得没有那么严格,各个模块的风格也各不相同。我不太清楚你提到的例子想表达什么,但确实,Python的库没有像Java或Win32那样统一的风格。这个语言(和库)是由一群志愿者共同开发的,没有公司给专门负责这个语言的人发工资,这一点有时候会显露出来。

当然,我认为其他方面的优点超过了这个缺点,但这确实是一个缺点。

10

PEP 8建议默认使用下划线,但有时候不使用下划线主要是出于两个原因:

  • 为了和其他一些API保持一致(比如当前模块或者标准接口)
  • 因为不使用下划线不会影响可读性(甚至可能提高可读性)

针对你提到的具体例子:

  • popitem是字典对象上的一个老方法。其他采用这个方法的API也保持了这个拼写(也就是没有下划线)。

  • move_to_end是一个全新的方法。虽然这个对象上的其他方法都没有下划线,但它遵循了推荐的PEP 8规范,使用了下划线,因为movetoend很难读(主要是因为toe是个单词,所以大多数人的大脑在注意到nd后会需要回过头来重新解析)。

  • set_debuglevel(还有更新的set_tunnel)可能应该去掉下划线,以便和其他HTTPConnection API保持一致。不过,原作者可能只是更喜欢set_debuglevel而不是setdebuglevel(注意debuglevel也是HTTPConnection构造函数的一个参数,这也解释了为什么没有第二个下划线),然后set_tunnel的作者就顺着这个例子写了。

  • set_tunnel其实也是一个去掉下划线后可读性变差的例子。settunnel中两个“t”放在一起让人很难快速理解。

一旦这些不一致的命名方式进入了Python的发布模块,通常就不值得去麻烦地纠正它们(这在Python 2和Python 3之间的threading模块接口中做过,过程麻烦得让其他人都不愿意去“修复”其他类似的API)。

4

根据PEP8的内容:

最重要的是:要知道什么时候可以不遵循规范——有时候,风格指南并不适用。当你不确定的时候,运用你的判断力。看看其他的例子,决定哪个看起来更好。不要犹豫,随时可以问别人!

你提到的内容在某种程度上是符合PEP8的指导原则的;实际上,主要的不一致性出现在其他地方,通常是关于CamelCase的用法。

撰写回答