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


772

来自C#背景的变量和方法名称的命名约定通常为camelCase或PascalCase:

// C# example
string thisIsMyVariable = "a"
public void ThisIsMyMethod()

在Python中,我已经看到了上述内容,但也看到了使用下划线的情况:

# python example
this_is_my_variable = 'a'
def this_is_my_function():

有没有更优选的,确定的Python编码风格?

Answers:


867

请参阅Python PEP 8:函数和变量名称

函数名称应小写,必要时用下划线分隔单词,以提高可读性。

变量名遵循与函数名相同的约定。

仅在已经是主流样式(例如threading.py)的上下文中才允许使用blendCase,以保持向后兼容性。


127
PEP = Python增强建议。
彼得·莫滕森

8
@RickyRobinson您使用的是什么脑筋急转弯的代码编辑器,不知道下划线是一个单词吗?有很多免费的软件。如果没有IDE,我将使用Notepad ++。为此,可以下载用于python编辑的模板。(其他人可以推荐更有用的免费下载。)
ToolmakerSteve

57
强调样式的一种情况是,您可以更好地使用一个字母的单词。对于(一个相当愚蠢的)示例,findMeAClass可能比丑陋find_me_a_class
heltonbiker

9
我发现全小写变量名的约定不适用于科学计算,因为在科学计算中经常遇到用大写字母表示的众所周知的常数,张量等。
andreasdr 2014年

12
@rr PEP8是“样式指南”,并将其描述为约定而不是标准。它还清楚地解释了不总是遵循这些“规则”的原因。
塔哈恩

709

Google Python样式指南》具有以下约定:

module_namepackage_nameClassNamemethod_nameExceptionNamefunction_nameGLOBAL_CONSTANT_NAMEglobal_var_nameinstance_var_namefunction_parameter_namelocal_var_name

类似的命名方案应适用于 CLASS_CONSTANT_NAME


37
a)我喜欢例子-谢谢。b)CamelCase和下划线的吸引力不强?但是:我是Python的新手,它的数据模型更加灵活,我敢打赌Google的指南背后有扎实的思想……
Matthew Cornell

19
只要您坚持使用@MatthewCornell,混合效果还不错。如果您知道函数带有下划线,而类没有下划线,则实际上会使可读性更容易。
Pithikos

1
@MatthewCornell我不认为它与python有关。Go实际上会强制执行美的任意标准,并且如果您不遵守它们的大括号惯例,则将无法编译。本质上,这是一个骰子,用于确定某人是否确实有一个仔细的思考,或者只是真的喜欢他们的做事方式。
Parthian Shot

您是否将常量静态属性视为GLOBAL_CONSTANT_NAME?它不完全是全局的,因为它属于类的范围。
James T.

然后走进去property……也许这是假装该物品是什么的问题,而不是它的实际情况
约尔布

240

大卫·Goodger(在“代码就像Pythonista” 在这里)描述了PEP 8项建议如下:

  • joined_lower 用于函数,方法,属性,变量

  • joined_lowerALL_CAPS常量

  • StudlyCaps 上课

  • camelCase 仅符合先前的约定


3
+1个视觉示例。虽然我不能看到PEP8建议joined_lower常数,只有“全部大写字母加下划线分隔的话”。对新的枚举功能也感到好奇。
鲍勃·斯坦

1
StudlyCaps for classes对于几乎所有语言的类来说,这是一个伟大的通用规则。那么,为什么会有一些python内置类(例如datetime.datetime不遵循该约定呢?)
Prahlad Yeri

3
@PrahladYeri:不幸的是,unittest.TestCase.assertEqual朋友也不遵循snake_case约定。事实是,Python标准库的某些部分是在约定确立之前开发的,我们现在仍然坚持使用它们。
wchargin

3
CamelCase令人困惑,因为有人说它是“ camelCase”(也称为“ mixedCase”),而有人说它是“ CamelCase”(也称为“ StudlyCaps”)。例如,PEP提及“ CamelCase”,而您提及“ camelCase”。
Pro Q

您的此处链接已死,也许应该用david.goodger.org/projects/pycon/2007/idiomatic之
Wolf,

42

正如Python代码样式指南所承认的那样,

Python库的命名约定有些混乱,因此我们永远都无法做到这一点

请注意,这仅指Python的标准库。如果他们不能得到那个一致,那么就几乎是具有很大的希望通常附着到约定所有的 Python代码,不是吗?

因此,在这里的讨论中,我可以推断出,如果在过渡到Python时继续使用变量或函数的Java或C#命名惯例(例如清晰明确的命名规则),这并不是一个可怕的罪过。当然,请记住,最好遵守代码库/项目/团队的流行风格。正如《 Python风格指南》指出的那样,内部一致性最重要。

随意将我视为异端。:-)像OP一样,我也不是“ Pythonista”,无论如何也没有。


32

如其他答案所示,有PEP 8,但是PEP 8只是标准库的样式指南,在其中仅作为福音。PEP 8对于其他代码段最常见的偏差之一是变量命名,尤其是方法。尽管考虑到使用mixedCase的代码量很大,但没有单一的主导风格,如果要进行严格的普查,则可能最终会得到带有mixedCase的PEP 8版本。与PEP 8几乎没有其他偏差是很常见的。


9
在'08回答时,这可能是正确的,但是如今,几乎所有主要库都使用PEP 8命名约定。
塔娜·布里姆霍尔

28

如前所述,PEP 8表示可lower_case_with_underscores用于变量,方法和函数。

我更喜欢使用lower_case_with_underscores变量以及mixedCase方法和函数使代码更明确和可读。因此,遵循Python Zen的 “显式优于隐式”和“可读性”


3
+1我切换了这两个变量(我对变量使用了mixCase),但是使所有内容更加独特有助于使您立即了解正在处理的内容,尤其是因为您可以传递函数。
熊恰亚诺夫,09年

2
尽管“可读性”是高度主观的。我发现下划线的方法更具可读性。
Pithikos 2014年

您的偏好是我最初的直觉来自多年的Java开发。我喜欢将_用作变量,但是从我的角度来看,对于函数和方法来说,它看起来有点有趣。
Michael Szczepaniak

21

@JohnTESlade回答的内容更进一步。Google的python样式指南提供了一些非常简洁的建议,

避免使用的名称

  • 单个字符名称(计数器或迭代器除外)
  • 任何程序包/模块名称中的破折号(-)
  • \__double_leading_and_trailing_underscore__ names (由Python保留)

命名约定

  • “内部”是指模块内部或类中受保护或私有的内部。
  • 在单个下划线(_)前面有一些支持来保护模块变量和函数(import * from中不包括)。在实例变量或方法前加双下划线(__)可以有效地使变量或方法对其类具有私有性(使用名称修饰)。
  • 将相关的类和顶级功能放到一个模块中。与Java不同,不需要将自己限制为每个模块一个类。
  • 使用CapWords类的名字,但lower_with_under.py对模块名称。尽管有许多命名的现有模块CapWords.py,但现在不建议这样做,因为当碰巧以一个类命名该模块时会造成混淆。(“等待-我写import StringIO还是写from StringIO import StringIO?”)

源自Guido建议的指南 在此处输入图片说明


17

大多数python的人都喜欢使用下划线,但是自从5年前以来,即使我使用python,我仍然不喜欢它们。它们对我来说看起来很难看,但也许这就是我脑海中的所有Java。

我只是喜欢驼峰更好,因为它适合与类的命名方式更好,感觉更符合逻辑具有SomeClass.doSomething()SomeClass.do_something()。如果您在python中查看全局模块索引,则会发现这两者,这是因为它是随着时间的推移而增长的各种来源的库的集合,而不是由像Sun这样的公司开发的具有严格编码规则的库。我要说的底线是:使用任何您喜欢的更好的东西,这只是个人品味的问题。


10
我来自Java背景,我发现下划线很冗长,没有吸引力,只有后者才是意见。在某些方面,命名是可读性和简洁性之间的平衡。Unix太过分了,但是它的en.wikipedia.org/wiki/Domain-specific_language受限制。由于有大写字母,CamelCase可读,但没有多余的字符。2c
马修·康奈尔

2
对我而言,下划线在函数/方法中很有吸引力,因为我将每个下划线都视为虚拟(在我的脑海)命名空间的分隔符。这样,我可以很容易地知道如何命名我的新功能/方法:make_xpath_predicatemake_xpath_exprmake_html_headermake_html_footer
Pithikos

3
您通常不会调用(通常)调用SomeClass.doSomething()(通常很少使用静态方法)an_instance.do_something()
Dave

15

我个人尝试将CamelCase用于类,mixedCase方法和函数。变量通常用下划线分隔(当我记得时)。这样一来,我就可以一目了然地告诉我我到底在叫什么,而不是所有看起来都一样的东西。


15
驼峰大小写以小写字母IIRC开头,例如“ camelCase”。
UnkwnTech,

11
我认为结晶是正确的-至少,他的用法与PEP8(CamelCase和mixedCase)中的用法一致。
加勒特

1
@UnkwnTech FirstLetterUpper的术语有时称为PascalCase
SurpriseDog

CamelCase还是camelCase?就是想。
Sumit Pokhrel

11

有一篇关于此的论文:http : //www.cs.kent.edu/~jmaletic/papers/ICPC2010-CamelCaseUnderScoreClouds.pdf

TL; DR它说snake_case比camelCase更具可读性。这就是为什么现代语言在任何可能的地方使用(或应该使用)蛇的原因。


9
有趣的是,它还说:“这项研究的结果不一定适用于嵌入在源代码中的标识符。当嵌入在编程结构内部时,驼峰式标识符完全有可能成为更好的格式塔元素。”
rob3c

2

编码风格通常是组织内部政策/惯例标准的一部分,但我认为一般来说,all_lower_case_underscore_separator风格(也称为snake_case)在python中最为常见。


0

在以其他编程语言进行开发时,我个人使用Java的命名约定,因为它一致且易于遵循。这样,我就不会一直在努力使用哪些约定不应该成为我项目中最难的部分!


我有点同意。如果语言X只是项目的一小部分,则如何格式化文本的上下文切换可能会很麻烦。主要的问题是库将以一种样式(library_function(my_arg))进行调用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.