为什么我们有lower_case_with_underscores命名约定?

时间:2009-11-16 04:50:49

标签: python naming-conventions camelcasing pep8

根据你的解释,这可能是也可能不是一个修辞问题,但它真的让我感到困惑。这个惯例有什么意义?我理解命名约定不一定要有背后的押韵或理由,但为什么偏离已经流行的camelCase? lower_case_with_underscores背后的一个押韵和原因我不知何故失踪了吗? (是的,我完整地阅读了PEP 8,是的,我确实知道它只是一个提案,指南等)。

我想我的真正问题是:我正在编写一个Python库。事实上,运气好的话,相对于我的其他项目,它可能是一个相当大的库。我已经尝试尽可能地遵守PEP 8,到目前为止,我甚至维护lower_case_with_underscores,因为PEP 8指示功能和方法名称。但是我不得不记得使用camelCase for Twisted,camelCase用于logging,以及其他所有内容。 我应该使用什么命名约定,为什么?

令人惊讶的是,我非常关心命名,足以写出一个冗长的问题,而且我也很惊讶。也许在这些事情上我有一点强迫症。我没有太多关于它的“个人意见”,因为我倾向于选择最常用的东西,在这种情况下,将是camelCase - 但它让我更加恼火的是找到那个我可能正在打破一些关于明确与隐含的永恒定律以及用石头或其他东西写成的蟒蛇的禅。

10 个答案:

答案 0 :(得分:48)

camelCase和/或CamelCase(这本身就是一场辩论;-)可能是最受欢迎的最熟悉的环境,但这几乎没有使它们具有普遍性 - 或者你从未听说过一种名为C ++的晦涩语言,其std::find_first_ofstd::replace_copy_if算法等等?!

所以没有“偏离”,正如你在PEP 8中所说的那样 - 只是对C ++的选择 - 对比那些在Java或C#中更受欢迎的公约。

至于你应该为自己的代码做些什么,只需选择一个约定并坚持下去 - 一致性比其他考虑因素更重要。我的雇主对所有内部资源使用所有语言的CamelCase约定(虽然不一定涉及暴露公共API,这是一个单独的问题),我个人厌恶它(我希望我可以销毁每个依赖整个编程领域的区分大小写! - ),但我坚持,并且实际上有助于强制执行它(在代码审查中),因为统一性 很重要。

我想你会理解为什么只有当你不得不依赖屏幕阅读器向你读代码时,依赖于区分大小写才是一个可怕的想法 - 大多数屏幕阅读器在查明案例问题上做得非常糟糕,并且没有非常好的方法,没有强大或简单的约定将案例差异转换为简单的听觉线索(将下划线转换为“点击”,在一个良好的可配置屏幕阅读器中,使它变得轻而易举)。对于没有任何视觉障碍的人,无疑是90%或更多,你不需要关心(除非你想要包容并帮助那些分享你完美礼物的人愿...娜,谁在乎那些的家伙,对吗?!)。

但是,一致性仍然很重要,并且有助于_every_body。

答案 1 :(得分:15)

我听说在其他情况下,word_with_underscores比非英语母语读者更容易分开,而不是wordByCamelCase。在视觉上,它需要较少的努力来解析单独的外来词。

答案 2 :(得分:12)

LowerCaseWithUnderScoresAreSuperiorBecauseTheTextYouNormallyReadInABookOrNewsPaperForExampleIsNotWrittenLikeThis。

答案 3 :(得分:6)

历史上可能有一个原因,许多计算机没有混合案例功能。在 COBOL 的时代,程序都是大写的。在80年代早期,许多“个人电脑”只带有大写字体。例如,您可以获得Apple II +的小写扩展卡。当程序开始允许混合案例时,骆驼案不受欢迎。许多程序采用了以前的全部大写,只是转换为小写。通过80年代的各种语言归结为案例意义,并在90年代Java中推广了camelCase语法。具有较早历史或与unix系统编程更紧密联系的语言往往避免对混合大小写进行语义使用。

答案 4 :(得分:5)

带有下划线约定的小写一直回到unix apis。他们的整个系统都在这个惯例中。

答案 5 :(得分:2)

使用您的商店使用的命名约定。

如果他们同意现有的约定是dorky(或者他们没有标准),并且不介意将所有代码清理成新的和改进的(更标准的)约定,那么你可以那样做。

答案 6 :(得分:2)

无论你做什么,我认为你保持一致非常重要。我看过几个样式指南(例如Google Python Style Guide),它们告诉你使用下划线。

我个人认为,使用带下划线的小写字母可以使代码更易于阅读。

你使用camelCasing?我不介意!始终有Glasses Mode。 :)

答案 7 :(得分:2)

这只是一个惯例,但如果你使用很多缩写就很有用。

你是如何编写EmailConfig(或者是EMailConfig)的?的HTTPRequest?然后,email_config和http_request就更清晰了。

答案 8 :(得分:1)

Meyers是否提出了aLongAndTotallyUnreadableMethodeName vs an_even_longer_but_perfectly_readable_method_name比较?

如果你已经习惯了,那么你最喜欢的约会看起来会更自然。但新程序员可能更喜欢下划线(样本量N = me,在2001年)。

我认为有些语言使用camelCase,因为它们的API非常糟糕。您需要额外的空间,以便代码可以放在IDE中而不需要包装。

例如:

poly = geometryLibrary.polygonGenerator.createFromPointSet(myList.listContentsToPointset())

答案 9 :(得分:0)

随意做任何最适合你的事情,但考虑使用一种流行的惯例。它使其他开发人员更容易熟悉您的代码。

请记住,在项目的整个生命周期中,花在阅读代码上的时间比编写代码花费的时间多。