当属性名称以下划线结尾时,这意味着什么?

11
类似问题:Python命名中使用下划线有什么好处?。此问题探讨了优缺点,而本文则着重分析在广义和Scikit-learn特定情况下使用下划线的原因。
我正在查阅Scikit-learn文档时,发现sklearn.model_selection.GridSearchCV的所有属性都以下划线结尾,例如:
  • cv_results_
  • best_params_
  • best_score_
为什么会这样呢?下划线有什么作用?请在回答时尽可能涵盖广泛的情况(即不仅限于Scikit-learn的GridSearchCV)。
我认为这不仅仅是Scikit-learn的特性,并且不确定应该打哪些标签,所以打了Scikit-learn的标签。请纠正标签(或我)。

1
下划线本身没有意义。这很可能是作者对命名约定(结果的)的偏好。有许多作者在sklearn中编写单独的模块。 - Jon
@Jon,你是否遇到过这种约定?如果是,你有没有观察到任何非正式的原因呢? - quanty
在这种情况下,由于我了解scikit-learn,属性名称后面的下划线表示这是一个变量/值,而不是函数。这只是作者通过查看名称来区分函数和变量的一种方便的方式。 - 1313e
1
我现在添加了一段来自sklearn开发者指南的内容,其中涉及到这个问题。他们对此有一个特定的解释。 - Marcus V.
2
@quanty:我认为这取决于你的意图。如果它是针对sklearn特定的话,那么它就不是重复的。如果你对Python有一般性的兴趣,那么Vivek Kumar是正确的,它就是一个重复的问题。如果是前者,那么我认为我的答案更正确 ;) - Marcus V.
显示剩余3条评论
1个回答

23

对于sklearn库,有一个特定的解释。请检查sklearn开发者指南,其中有一条注释说明了这个约定。该约定用于估算器属性,在调用fit()方法后具有有意义的值。

例如,可以使用它们来检查估算器是否已经适配,例如在这里

class LinearModel(six.with_metaclass(ABCMeta, BaseEstimator)):
    """Base class for Linear Models"""

    [...]

    def _decision_function(self, X):
        check_is_fitted(self, "coef_")

   [...]

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