在Python中,变量和函数的命名约定是什么?

1066
从C#背景来看,变量和方法的命名约定通常是camelCase或PascalCase。
// C# example
string thisIsMyVariable = "a"
public void ThisIsMyMethod()

在Python中,我见过上述的写法,但我也见过使用snake_case的写法。
# python example
this_is_my_variable = 'a'
def this_is_my_function():

有没有更好、更明确的Python编码风格?
15个回答

1122

195
PEP 是 Python 增强提案的缩写。 - Peter Mortensen
7
使用下划线的唯一问题是不能双击选中变量或函数名称...必须手动选择文本。这有点烦人。 - Ricky Robinson
72
下划线风格的一个用例是,您可以更好地使用单字词。举个(有点愚蠢的)例子,“findMeAClass”可能比“find_me_a_class”更难看。 - heltonbiker
16
我发现在科学计算中,全小写的变量名想必不太适用。因为我们经常会遇到一些以大写字母表示的著名常数、张量等等。 - andreasdr
25
PEP8是一个“风格指南”,它将自己描述为一种约定,而不是标准。它还清楚地解释了为什么不总是遵循这些“规则”。 - The Tahaan
显示剩余19条评论

1070

Google Python风格指南提出了以下的命名规范:

module_namepackage_nameClassNamemethod_nameExceptionNamefunction_nameGLOBAL_CONSTANT_NAMEglobal_var_nameinstance_var_namefunction_parameter_namelocal_var_name

CLASS_CONSTANT_NAME中同样应该采用类似的命名方式。


52
a) 我喜欢例子 - 谢谢。 b) 将驼峰命名法和下划线混合在一起看起来不够美观?但是,作为一个新手接触 Python 和其更灵活的数据模型,我敢打赌 Google 的指南背后有充分的思考。 - Matthew Cornell
33
只要你坚持不变,混合编程并不会有什么问题。如果你知道函数使用下划线而类别不使用,它实际上可以使代码更易读。 - Pithikos
2
@MatthewCornell 我不会认为这与Python有任何关系。Go实际上强制执行任意美学标准,如果您不遵守例如他们的花括号约定,它将无法编译。基本上,这是一个掷骰子的游戏,看看是否有人真正仔细思考过,或者只是喜欢他们做事情的方式。 - Parthian Shot
你会考虑将一个常量静态属性命名为GLOBAL_CONSTANT_NAME吗?它并不完全是全局的,因为它在类的范围内。 - James T.
然后进入“property”...也许问题在于该项所假装的身份,而不是它实际上的身份。 - joel
显示剩余3条评论

298

David Goodger(在“像Pythonista一样编写代码”这里)将PEP 8建议描述如下:

  • 函数、方法、属性、变量使用joined_lower

  • 常量使用joined_lowerALL_CAPS

  • 类名使用StudlyCaps

  • 仅为符合现有约定而使用camelCase


3
虽然我看不到PEP8建议对于常量使用joined_lower,但是建议使用“用下划线分隔单词的全大写字母”。我对新的enum功能也很好奇。+1 视觉示例。 - Bob Stein
3
“StudlyCaps for classes”是几乎所有语言中类的一个很好的通用规则。那么为什么一些Python内置类(例如datetime.datetime)不遵循这个约定呢? - Prahlad Yeri
5
不幸的是,unittest.TestCase.assertEqual和其他相关函数也没有遵循蛇形命名法。事实上,Python标准库的某些部分是在命名规则尚未确定之前开发的,现在我们只能接受它们了。 - wchargin
6
CamelCase很令人困惑,因为有些人说它是“camelCase”(也称为“mixedCase”),而有些人则称其为“CamelCase”(也称为“StudlyCaps”)。例如,PEP提到了“CamelCase”,而您提到了“camelCase”。 - Pro Q
你的超链接已经失效了,也许应该将其替换为类似于https://david.goodger.org/projects/pycon/2007/idiomatic/的内容。 - Wolf
如果 API 返回了驼峰命名的响应,而你的 Python 代码将其转换为具有下划线命名属性的对象,这样做是否可以?在我看来,应该保持 API 响应的命名方式。 - Sergius

57
作为Python代码风格指南承认的,Python库的命名约定有点混乱,所以我们永远无法完全一致。请注意,这仅适用于Python的标准库。如果他们不能使其一致,那么对于所有Python代码而言,就几乎没有遵循的公认惯例了吧?从这个角度和讨论中可以推断出,当切换到Python时,如果继续使用Java或C#的(清晰且已建立的)变量和函数命名约定,并保持内部一致性,那么这不是可怕的罪过。当然要记住,最好遵守代码库/项目/团队的主流风格。正如Python代码风格指南所指出的那样,内部一致性最重要。随意将我视为异端。 :-)像OP一样,我还不是“Pythonista”。

38

如上所述,PEP 8建议在变量、方法和函数中使用lower_case_with_underscores

我更喜欢在变量中使用lower_case_with_underscores,在方法和函数中使用mixedCase,这样可以使代码更加明确和易读。因此遵循Python之禅的"显式优于隐式"和"可读性很重要"。


5
我将那两个变量交换了一下(我使用mixedCase),但是这样使得每个变量都更加独特,有助于立即明确你正在处理的内容,特别是因为你可以传递函数。 - Xiong Chiamiov
7
尽管“易读性”具有很强的主观性,但我认为带下划线的方法更易读。 - Pithikos
您的偏好是我基于多年的Java开发而产生的第一直觉。我喜欢在变量中使用下划线,但对于函数和方法来说,在视觉上看起来有些奇怪。 - Michael Szczepaniak

35

PEP 8,正如其他答案所示,但PEP 8仅是标准库的风格指南,在该处仅被视为真理。 PEP 8在其他代码片段中最常见的偏差之一是变量命名,特别是对于方法。 没有单一的主导样式,尽管考虑到使用mixedCase的代码量,如果进行严格普查,则可能会得出一个具有mixedCase的PEP 8版本。 在PEP 8中很少有其他偏差是如此普遍。


15
这可能是在 '08 年回答这个问题时正确的,但现在几乎所有主要的库都使用 PEP 8 命名惯例。 - Thane Brimhall
3
@ThaneBrimhall 在2022年,我会狠狠地批评那些提交给我的新编写的不符合PEP 8规范的代码。 - Cerno

34
进一步回答@JohnTESlade的问题。Google的Python风格指南提供了一些非常不错的建议, 应避免的命名
  • 除计数器或迭代器外,避免使用单个字符的名称
  • 任何包/模块名称中不要使用破折号(-)
  • __double_leading_and_trailing_underscore__ names(Python保留名称)
命名约定 "Internal" 在模块内部或类中被保护或私有使用。
在模块变量和函数之前加上单下划线(_)可以部分保护它们(不适用于使用import * from的情况)。在实例变量或方法之前加上双下划线(__)可以使其对其类私有(使用名称改编)。
将相关的类和顶级函数放在一个模块中。与Java不同,不需要限制一个模块只有一个类。
类名使用CapWords,但模块名使用lower_with_under.py。尽管有许多现有的名为CapWords.py的模块,但现在不鼓励使用,因为当模块恰好以类命名时会产生混淆。(“等等--我是写import StringIO还是from StringIO import StringIO?”)
从Guido的建议中得出的准则 enter image description here

30

大多数Python开发人员偏爱使用下划线,但即使我已经使用Python超过5年,我仍然不喜欢它们。它们对我来说只是看起来很丑,但也许这只是因为我脑海中存有Java的影响。

我更喜欢驼峰式命名法,因为它更符合类的命名方式,SomeClass.doSomething()SomeClass.do_something()更符合逻辑。如果您在Python全局模块索引中查找,您会发现两种命名方式都存在,这是由于它是一个从各个来源收集的库的集合,随着时间的推移而增长,并不像Sun公司那样由一个公司开发,具有严格的编码规则。我想说的是:使用自己喜欢的命名方式,这只是个人口味问题。


14
我来自Java编程背景,我认为下划线很啰嗦且不好看,后者是个人见解。命名在某些方面是可读性和简洁性之间的平衡。Unix走得太远了,但它的http://en.wikipedia.org/wiki/Domain-specific_language有限。CamelCase由于首字母大写而易读,但没有额外的字符。 - Matthew Cornell
4
对我来说,在函数/方法中使用下划线很吸引人,因为我把每个下划线看作是虚拟(在我的脑海中)命名空间的分隔符。这样我就可以轻松知道如何命名我的新函数/方法: make_xpath_predicate, make_xpath_expr, make_html_header, make_html_footer - Pithikos
10
通常不会调用 SomeClass.doSomething() (静态方法通常很少见),而是调用 an_instance.do_something() - Dave

21

个人而言,我尽量使用驼峰命名法来定义类名,混合式命名法来定义方法和函数名。变量通常使用下划线分隔(只要我能记得)。这样一来,我可以一眼看出我所调用的内容,而不是所有东西看起来都一样。


15
驼峰命名法以小写字母开头,如果我没记错的话,像“camelCase”这样。 - UnkwnTech
12
我认为crystalattice说得对 - 至少他的用法与PEP8中的用法一致(驼峰式和混合大小写)。 - Jarrett
1
@UnkwnTech,“FirstLetterUpper”的术语有时被称为PascalCase。 - SurpriseDog
驼峰命名法(CamelCase)还是小驼峰命名法(camelCase)?只是好奇。 - Sumit Pokhrel
2
据我所知,它是PascalCase和camelCase。@SumitPokhrel - Alejandro QA

17

14
有趣的是,它还说:“这项研究的结果可能并不适用于嵌入源代码中的标识符。完全有可能,在编程结构内部嵌入驼峰式标识符可能会更好地作为整体元素。” - rob3c
1
我认为使用snake_case的原因之一是许多系统过去都会将所有字母都大写,因此CamelCase变成了CAMELCASE。现在情况已经不同了。就个人而言,我喜欢在内部、低级别的系统中使用snake_case,并将mixedCase/CamelCase用于接口。我不知道这些人是如何进行研究的,但我的眼睛对于短的CamelCase和mixedCase名称来说绝对是最快的。 - Justin Zhang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接