我习惯以这种方式为Python参数命名:
my_argument='foo'
如果我这样做,有什么好处:
my_argument_='foo"
按照PEP008的建议,应该这样做吗?
那么为什么要使用下划线结尾呢?肯定有一个充分的理由,是什么呢?
我习惯以这种方式为Python参数命名:
my_argument='foo'
如果我这样做,有什么好处:
my_argument_='foo"
按照PEP008的建议,应该这样做吗?
那么为什么要使用下划线结尾呢?肯定有一个充分的理由,是什么呢?
就像PEP中所描述的那样:它允许您使用本来是Python关键字的内容。
as_
with_
for_
in_
除非名称与关键字冲突,否则PEP8不建议使用此命名约定。 my_argument
显然没有冲突,因此没有理由使用下划线,而且PEP8也不建议这样做。
scikit
经常使用它吗?基本上在一些计算后的所有输出中,例如在调用obj.fit()之后,输出会填充默认为空的*_参数(http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html)。这是一个好习惯吗? - Intelligent-Infrastructure这种约定没有优势,但在不同的项目中可能有特殊含义。例如在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_
但这一次,它将返回每列的系数而不会产生任何错误。这是使用此约定的方法之一, 在不同的项目中可能意味着不同的事情。
通常这样的命名约定在Python中没有任何实证目的(即它们除了避免关键字冲突外没有任何特殊作用)。例如,你不会将变量命名为class
,对吧?你会命名为class_
以避免与内置关键字冲突。
_single_leading_underscore
的说法,PEP8 规定:_single_leading_underscore
是一个弱的“内部使用”指示器。例如,from M import *
不会导入名称以下划线开头的对象。 - zhangxaochen
my_argument_
而不是my_argument
的内容。 - Steve Jessop