你如何 PEP 8 命名一个名称是首字母缩略词的类?

Posted

技术标签:

【中文标题】你如何 PEP 8 命名一个名称是首字母缩略词的类?【英文标题】:How do you PEP 8-name a class whose name is an acronym? 【发布时间】:2010-05-17 23:05:42 【问题描述】:

我尽量遵守 Python 代码的样式指南(也称为 PEP 8)。因此,命名类的首选方法是使用 CamelCase:

几乎无一例外,类名 使用 CapWords 约定。内部使用的类还有一个前导下划线。

如果我的班级名称由两个首字母缩写词组成(在正确的英语中应该大写),我如何与 PEP 8 保持一致。例如,如果我的班级名称是“NASA JPL”,你会给它起什么名字?:

class NASAJPL():  # 1
class NASA_JPL(): # 2
class NasaJpl():  # 3

我正在使用#1,但它看起来很奇怪; #3 看起来也很奇怪,而 #2 似乎违反了 PEP 8。

【问题讨论】:

@fuzzy:我不明白 JPL(喷气推进实验室)不是首字母缩写词,而 NASA(美国国家航空航天局)是。我也无法理解有人认为您的评论很棒,但这可以归因于我自己的不足之处。 :) 首字母缩略词是一个单词的缩写。你说 JPL 作为一个词,就像 JayPul 一样?不,你说字母,J,P,L。这是一个缩写。 考虑更广泛的 Python 工具集 - 特别是 pylint 类型的工具。他们不善于在 Python 类、方法和变量名中发现英语。将 Python 视为一门外语而不是英语方言可能会让您“放开”大写首字母缩略词并使用 #3 #opinion 作为一个局外人,我可以看出NasaJpl 是两个不同的首字母缩写词。这应该给你一个提示。可读性比一些人为的随机规则更重要 【参考方案1】:

PEP-8 确实涵盖了这一点(至少部分):

注意:在 CapWords 中使用缩写词时,缩写词的所有字母都大写。因此HTTPServerError 优于HttpServerError

我的意思是NASAJPL() 是根据 PEP-8 推荐的名称。

我个人认为NasaJpl() 和easiest to scan 是因为大写字母很容易标记单词边界并赋予名称独特的形状。

【讨论】:

我同意。 PEP-8 不是圣法。打破它的任何规则,而不是编写任何完全野蛮的代码。 (NASAJPL() 我会算在哪个类别中。) 我将接受您的回答作为“最接近共识”非常感谢。 @bobince:这就是 PEP-8 的说法。恕我直言,最重要的部分之一! “样式指南是关于一致性的。与此样式指南的一致性很重要。项目内的一致性更为重要。一个模块或功能内的一致性是最重要的。”(PEP-8) 您使用的是 pylint 还是类似的?这样的工具对您的命名约定决定有影响吗?【参考方案2】:

正如其他人所指出的,NASAJPL 可能是 PEP-8 批准的形式。

然而,恰恰相反,我可能会使用 NasaJPL。因为如果您正在阅读它,您会将“NASA”发音为一个单词,而将“JPL”发音为一个单词。

您可以论证这与 PEP-8 一致,因为“NASA”是首字母缩写词,但“JPL”是缩写词(或首字母缩写词,如果您想获得 pedantic)。

【讨论】:

这似乎是一个非常合理的论点。 NasaJPL 看起来很恶心,但这就是我【参考方案3】:

#1 在这种特殊情况下对我来说看起来不错(如果它是真的一个首字母缩写词)。出于好奇,它代表什么(类实例到底是什么,也许module 会是更合适的除数)?

class NASAJPL:

编辑:当您组合两个首字母缩写词时,您可能希望将功能划分为模块(您永远不知道何时将下一个功能添加到您的程序中):

from NASA import JPL
from NASA import ARC

【讨论】:

国家航空航天局喷气推进实验室。要么就是这样,要么我是一个真正的极客,并且对事物的阅读过多。 什么,美国国家航空航天局的喷气推进实验室? 我以缩写词 NASA 和 JPL 为例(美国国家航空航天局/喷气推进实验室)。在我的实际应用程序中,我还有其他首字母缩写词(其中很多!) 根据使用模块将两个首字母缩写词分成单独的命名空间的可行性编辑了答案。 #1 的问题在于 NASAJPLJPLARC 看起来像符号常量,在 PEP8 和更广泛的世界中都使用全大写。【参考方案4】:

我也在一个缩写词繁重的环境中工作。我倾向于使用 #3 形式,因为即使它是首字母缩略词的小写部分,它也清楚地描述了名称的一部分。当名称的一部分是首字母缩写词而一部分是单词时,它还可以避免混淆。

【讨论】:

同意。我发现一致的大写倾向于使阅读代码时更容易。您在阅读英语时知道大写字母表示名称。同样,在 Python 中(通过 PEP-8),当遇到 CamelCased 的东西时,你知道它是一个类。【参考方案5】:

我倾向于使用#3。一开始看起来很奇怪,但你(有点)习惯了。我在一堆首字母缩略词挤在一起受苦太久后走了这条路,例如。 NPCAIXMLParser 就是其中之一。我认为 NpcAiXmlParser 更容易阅读,并且从那以后一直在这样做,尽管有时看到这些小写的东西仍然看起来很奇怪。

就“标准”而言,我倾向于将这些实体视为“单词”,因此将它们大写,就像我将任何其他单词大写一样。例如。如果我有一个代表某个 NPC(非玩家角色)的局部变量,我会将其命名为“npc”而不是“nPC”。

关于 PEP-8,我不同意这种说法;我发现这个词的最后一个拼写更可取。

注意:在使用缩写时 CapWords,将所有字母大写 的缩写。因此 HTTPServerError 优于 HttpServer 错误。

【讨论】:

想知道为什么反对票,给出了与其他赞成的答案类似的内容(但更早发布)?【参考方案6】:

你做对了。

如果ChristophD 的split it into a module hierarchy 建议不是一个可行的选择,那么我建议你的#2 表单 (class NASA_JPL ():) 是最清晰的,PEP-8 是该死的。

不,真的……

也就是说...我不认为 PEP-8 需要被诅咒才能让您使用该选项并且仍然坚持其核心原则。正如您在原始问题中指出的那样,“CamelCase 类名”指南的第一句话开始:

几乎无一例外,[...]

PEP-8 的“基本原则”声明,正如 Dan 与 "A Foolish Consistency [...]" 行所暗示的那样,宣布易读性和可理解性是 PEP-8 建议的主要目标。 PEP-8 是为实现这些目标而建立的成功模式的集合。

Emerson 关于 PEP-8 在现实中的应用...

从根本上说,任何系统都有必然与整体特征不一致的方面。当系统良好且一致地使用样式指南的建议时,任何不一致都将是有意识必要性的响应。 (我认为保持极端案例的易读性是必要的。)

当以这种方式处理时,这些不一致会违反直觉,加强整体的凝聚力,而不是破坏它。

PEP-8 更简洁地说明了这一点(因此,更有用:)):

但最重要的是:知道什么时候不一致——有时是风格 指南只是不适用。如有疑问,请使用您的最佳判断。看 在其他示例中并决定什么看起来最好。不要犹豫,问!

打破特定规则的两个充分理由:

    应用规则会降低代码的可读性,即使对于习惯阅读遵循规则的代码的人也是如此。

    为了与也破坏它的周围代码保持一致(可能是出于历史原因)——尽管这也是清理别人的烂摊子的机会(在真正的 XP 风格中)。

【讨论】:

【参考方案7】:

数字 1 对我来说太难读了 - 无法判断它是两个首字母缩略词。

2 号违反了 PEP8,但看起来不错。记住“愚蠢的一致性是小人的妖精”:)

我最喜欢 3 号,但我经常使用 C# 编程 - 这就是你应该在 C# 中使用的方式。

【讨论】:

【参考方案8】:

这取决于首字母缩写词。另一个选项是class NASAJpl():,这使得“NASA”似乎是主要部分,而“JPL”是从属部分。

【讨论】:

以上是关于你如何 PEP 8 命名一个名称是首字母缩略词的类?的主要内容,如果未能解决你的问题,请参考以下文章

驼峰命名,帕斯卡命名,短横线命名

帕斯卡命名法和骆驼命名法

PEP 8 -- Python代码格式规则

JUnit单元测试规范

Camel Back 中的首字母缩略词

命名法:骆驼(Camel)帕斯卡(pascal)匈牙利(Hungarian)下划线(_)