ChatGPT解决这个技术问题 Extra ChatGPT

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

来自 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 是否有更可取、更明确的编码风格?


C
Community

请参阅 Python PEP 8: Function and Variable Names

函数名称应为小写,必要时用下划线分隔单词以提高可读性。变量名遵循与函数名相同的约定。混合大小写只允许在已经是流行样式的上下文中(例如 threading.py),以保持向后兼容性。


PEP = Python 增强提案。
@RickyRobinson 您正在使用什么脑死代码编辑器,不知道下划线继续一个单词?很多免费的。如果 IDE 不可用,我使用 Notepad++。为此,可以下载一个用于 python 编辑的模板。 (其他人可以推荐更有用的免费下载。)
下划线样式的一种情况是您可以更好地使用单字母单词。对于(一个相当愚蠢的)示例,findMeAClass 可能比 find_me_a_class 更丑。
我发现全小写变量名的约定不适用于科学计算,在科学计算中经常会遇到用大写字母表示的众所周知的常量、张量等。
@rr PEP8 是“样式指南”,将自己描述为约定,而不是标准。它还清楚地解释了不总是遵循这些“规则”的原因。
B
Boris Verkhovskiy

Google Python Style Guide 具有以下约定:

模块名、包名、类名、方法名、异常名、函数名、GLOBAL_CONSTANT_NAME、全局变量名、实例变量名、函数参数名、本地变量名。

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


a)我喜欢例子-谢谢。 b) CamelCase 和下划线的不吸引人的混合?但是:作为 Python 的新手及其更灵活的数据模型,我敢打赌 Google 的指南背后有坚实的思想......
@MatthewCornell 混音还不错,只要你坚持。如果你知道函数有下划线而类没有,它实际上使可读性更容易。
@MatthewCornell我不认为它与python有任何关系。 Go 实际上强制执行任意的美观标准,如果您不遵守例如它们的花括号约定,将无法编译。从本质上讲,这是一个掷骰子,看某人是否真的有一个仔细的想法,或者只是真的很喜欢他们做事的方式。
你会考虑一个常量静态属性 GLOBAL_CONSTANT_NAME 吗?它并不完全是全局的,因为它在类的范围内。
然后走进property ...也许这是该项目假装的问题,而不是它实际上是什么
u
unmounted

David Goodger(在“像 Pythonista 一样的代码”here 中)描述了 PEP 8 建议如下:

join_lower 用于函数、方法、属性、变量

join_lower 或 ALL_CAPS 用于常量

用于课堂的StudlyCaps

camelCase 仅符合预先存在的约定


+1 视觉示例。虽然我看不到 PEP8 为 constants 建议 joined_lower 的位置,但只有“所有带有下划线分隔单词的大写字母”。还对新的 enum 功能感到好奇。
StudlyCaps for classes 是一个适用于几乎所有语言的类的通用规则。那为什么有些python内置类(比如datetime.datetime)不遵循这个约定?
@PrahladYeri:不幸的是,unittest.TestCase.assertEqual 和朋友们也没有遵循蛇案例约定。事实是,Python 标准库的某些部分是在约定固化之前开发的,而我们现在被它们困住了。
CamelCase 令人困惑,因为有些人说它是“camelCase”(也称为“mixedCase”),有些人说它是“CamelCase”(也称为“StudlyCaps”)。例如,PEP 提到“CamelCase”,而您提到“camelCase”。
您的此处链接已失效,也许应该将其替换为 david.goodger.org/projects/pycon/2007/idiomatic
J
Jonik

正如 Style Guide for Python Code 承认的那样,

Python 库的命名约定有点乱,所以我们永远不会完全一致

请注意,这仅指 Python 的标准库。如果他们不能保持一致,那么几乎没有希望为所有 Python 代码制定一个普遍遵守的约定,是吗?

从这点,以及这里的讨论,我会推断,如果一个人在过渡到 Python 时继续使用例如 Java 或 C#(明确和完善)的变量和函数命名约定,这并不是一种可怕的罪过。当然,请记住,最好遵守代码库/项目/团队的流行风格。正如 Python 风格指南所指出的,内部一致性最重要。

请随意将我视为异端。 :-) 像 OP 一样,我不是“Pythonista”,反正还不是。


c
claytron

如前所述,PEP 8 说将 lower_case_with_underscores 用于变量、方法和函数。

我更喜欢将 lower_case_with_underscores 用于变量,将 mixedCase 用于方法和函数,这样可以使代码更加明确和易读。因此遵循Zen of Python's“显式优于隐式”和“可读性计数”


+1我切换了这两个(我使用mixedCase作为变量),但是让所有更独特的东西都有助于让你立即明白你正在处理什么,特别是因为你可以传递函数。
尽管“可读性”是高度主观的。我发现带有下划线的方法更具可读性。
您的偏好是我从多年的 Java 开发中获得的最初直觉。我喜欢将 _ 用于变量,但从眼睛看来,对于函数和方法,我觉得它有点滑稽。
T
Thomas Wouters

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


这在 08 年得到回答时可能是正确的,但现在几乎所有主要库都使用 PEP 8 命名约定。
@ThaneBrimhall 在 2022 年,我将踢每个人的屁股,他们将新编写的非 PEP 8 符合代码交给我进行审查。
S
Sufiyan Ghori

进一步了解@JohnTESlade 的回答。 Google's python style guide 有一些非常简洁的建议,

要避免的名字

除计数器或迭代器外的单个字符名称

任何包/模块名称中的破折号 (-)

\__double_leading_and_trailing_underscore__ 名称(由 Python 保留)

命名约定

“内部”是指模块内部或类中受保护或私有的。

前置单个下划线 (_) 对保护模块变量和函数有一些支持(不包括在 import * from 中)。为实例变量或方法添加双下划线 (__) 可以有效地使变量或方法对其类私有(使用名称修饰)。

将相关的类和顶级函数放在一个模块中。与 Java 不同,没有必要将自己限制为每个模块一个类。

使用 CapWords 作为类名,而使用 lower_with_under.py 作为模块名。尽管有许多名为 CapWords.py 的现有模块,但现在不鼓励这样做,因为当模块碰巧以类命名时会造成混淆。 (“等等——我写的是 import StringIO 还是 from StringIO import StringIO?”)

https://i.stack.imgur.com/uBr10.png


c
cxrodgers

大多数 python 人更喜欢下划线,但即使我使用 python 已经超过 5 年了,我仍然不喜欢它们。它们对我来说看起来很丑,但也许这就是我脑海中的全部 Java。

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


我来自 Java 背景,我发现下划线冗长且没有吸引力,只有后者是意见。命名在某些方面是可读性和简洁性之间的平衡。 Unix 走得太远了,但它的 en.wikipedia.org/wiki/Domain-specific_language 是有限的。由于大写,CamelCase 是可读的,但没有额外的字符。 2c
对我来说,下划线在函数/方法中很有吸引力,因为我将每个下划线都视为虚拟(在我的脑海中)命名空间的分隔符。这样我就可以轻松知道如何命名我的新函数/方法:make_xpath_predicatemake_xpath_exprmake_html_headermake_html_footer
您不(通常)调用 SomeClass.doSomething()(静态方法通常很少见)您通常调用 an_instance.do_something()
c
crystalattice

我个人尝试将 CamelCase 用于类、mixedCase 方法和函数。变量通常用下划线分隔(当我记得的时候)。这样我就可以一眼看出我在调用什么,而不是所有看起来都一样。


Camel case 以小写字母 IIRC 开头,例如“camelCase”。
我认为 Crystalattice 是正确的 - 至少,他的用法与 PEP8 中的用法(CamelCase 和混合大小写)一致。
@UnkwnTech FirstLetterUpper 的术语有时称为 PascalCase
骆驼案还是骆驼案?就是想。
@SumitPokhrel 它是 PascalCase 和 camelCase,AFAIK。
a
alebian

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

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


有趣的是,它还说,“这项研究的结果可能不一定适用于嵌入源代码中的标识符。当嵌入到编程结构中时,驼峰式标识符完全有可能充当更好的格式塔元素。”
我认为使用snake_case背后的很多原因是许多系统习惯于将所有内容都大写,因此CamelCase变成了CAMELCASE。现在情况不再如此。就个人而言,我喜欢对内部的、低级的、系统的东西使用snake_case,并为接口保留mixedCase / CamelCase。我不知道这些人是怎么研究的,我的眼动追踪绝对是 CamelCase 和 mixCase 短名称最快的。
S
Shawn Mehan

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


b
bradylange

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


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

列宁告诉...我也来自 Java/C# 世界。和 SQL 一样。仔细检查自己,试图在一切都是对象的列表字典中找到复杂结构的第一眼可理解的示例,例如列表。至于我 - camelCase 或其变体应该成为任何语言的标准。复杂句子应保留下划线。


K
Kai - Kazuya Ito

是否在课堂上或不在课堂上:

变量和函数都是小写的,如下所示:

name = "John"
def display(name):
    print("John")

如果它们是多个单词,则用下划线“_”分隔,如下所示:

first_name = "John"
def display_first_name(first_name):
    print(first_name)

并且,如果变量是常量,则为大写,如下所示:

FIRST_NAME = "John"

y
yfeldblum

通常,遵循语言标准库中使用的约定。