Python命名中尾随下划线的优点是什么?

Mar*_*rio 7 python namespaces

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

my_argument='foo'
Run Code Online (Sandbox Code Playgroud)

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

my_argument_='foo" 
Run Code Online (Sandbox Code Playgroud)

如PEP008推荐的那样?

尾随下划线必须有充分的理由,那么它是什么?

Ign*_*ams 16

正是它在PEP中提供的内容:它允许您使用原本可能是Python关键字的东西.

as_
with_
for_
in_
Run Code Online (Sandbox Code Playgroud)


Dan*_*man 8

PEP8也不会建议使用此命名惯例,除了原本与关键字相冲突的名字.my_argument显然不会发生冲突,所以没有理由使用下划线而PEP8不建议您这样做.

  • 所以有人能说出为什么`scikit`经常使用它吗?基本上对于一些计算之后的所有输出,例如在调用obj.fit()之后,输出填充否则为空*_ params(http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html ).这是好习惯吗? (3认同)

gun*_*tan 8

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

from sklearn.linear_model import LinearRegression

lr = LinearRegression()
lr.coef_
AttributeError: 'LinearRegression' object has no attribute 'coef_'
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,当您尝试获取对象coef_的属性时lr,您将得到一个AttributeError,因为它尚未创建,因为fit尚未调用。

lr = LinearRegression()
lr.fit(X, y)
lr.coef_
Run Code Online (Sandbox Code Playgroud)

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