Python命名中使用下划线的优势是什么?

21

我习惯以这种方式为Python参数命名:

my_argument='foo'

如果我这样做,有什么好处:

my_argument_='foo" 

按照PEP008的建议,应该这样做吗?

那么为什么要使用下划线结尾呢?肯定有一个充分的理由,是什么呢?


我在PEP-8中没有看到任何建议将参数称为my_argument_而不是my_argument的内容。 - Steve Jessop
4个回答

36

就像PEP中所描述的那样:它允许您使用本来是Python关键字的内容。

as_
with_
for_
in_

哦,抱歉,我只是基本上重复了你的答案,但你比我先回答了! - user3002473
如果我不想使用这些关键字怎么办?下划线加无后缀会是更好的选择吗? - Mario
@IgnacioVazquez-Abrams,我知道。我的意思是,如果我不想使用任何保留名称来命名参数。只使用下划线但不添加尾缀是否可以?或者"my_argument_"仍然更好? - Mario
如果您不打算将关键字用作名称,那么为什么要使用下划线后缀呢? - Ignacio Vazquez-Abrams
@IgnacioVazquez-Abrams 这就是我来这里提问的原因,因为我无法弄清楚。现在我足够自信,可以命名我的参数而不需要这个下划线。谢谢。 - Mario
显示剩余2条评论

18

除非名称与关键字冲突,否则PEP8不建议使用此命名约定。 my_argument 显然没有冲突,因此没有理由使用下划线,而且PEP8也不建议这样做。


谢谢你的回答,但我没有足够的声望来投票。 - Mario
6
有人能告诉我为什么scikit经常使用它吗?基本上在一些计算后的所有输出中,例如在调用obj.fit()之后,输出会填充默认为空的*_参数(http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html)。这是一个好习惯吗? - Intelligent-Infrastructure
1
在scikit-learn中,下划线后缀是一种惯例,用于指示仅在估计器拟合后才可用的属性。在此处提到:https://scikit-learn.org/stable/developers/develop.html#estimated-attributes - David Gilbertson

8

这种约定没有优势,但在不同的项目中可能有特殊含义。例如在scikit-learn中,它意味着在调用 fit() 后,带下划线结尾的变量可以拥有值。

from sklearn.linear_model import LinearRegression

lr = LinearRegression()
lr.coef_
AttributeError: 'LinearRegression' object has no attribute 'coef_'

在上述代码中,当您尝试获取lr对象的coef_属性时,您将会得到一个AttributeError,因为该属性由于尚未调用fit而未被创建。
lr = LinearRegression()
lr.fit(X, y)
lr.coef_

但这一次,它将返回每列的系数而不会产生任何错误。这是使用此约定的方法之一, 在不同的项目中可能意味着不同的事情。


2

通常这样的命名约定在Python中没有任何实证目的(即它们除了避免关键字冲突外没有任何特殊作用)。例如,你不会将变量命名为class,对吧?你会命名为class_以避免与内置关键字冲突。


2
我不同意你关于 _single_leading_underscore 的说法,PEP8 规定:_single_leading_underscore 是一个弱的“内部使用”指示器。例如,from M import * 不会导入名称以下划线开头的对象。 - zhangxaochen

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