69

我刚刚尝试用 Pylint 整理一些代码,最后剩下的错误是

R0902: too-many-instance-attributes (8/7)

我理解限制实例属性数量背后的基本原理,但七个似乎有点低。我也意识到 linter 不应该有最后的发言权。但是,我想知道我应该做什么,而不是:

def __init__(self, output_file=None, output_dir=None):
    """
    Set the frobnicator up, along with default geometries
    """

    self.margin = 30

    self.pos = [0, 0]
    self.sep = [5, 5]

    self.cell = [20, 20]

    self.frobbr = library.Frobbr()

    page = self.frobbr.get_settings('page')

    self.lim = [page.get_width() - self.margin,
                page.get_height() - self.margin]

    self.filename = output_file
    self.moddir = output_dir

我应该将几何图形打包成一个字典,做其他事情来阻止 Pylint 抱怨,还是忽略它(我真的不想这样做)?

4

4 回答 4

101

linter 的工作是让您意识到代码的潜在问题,正如您在问题中所说,它不应该有最终决定权。

如果您考虑了 pylint 必须说的内容并决定对于此类,您拥有的属性是适当的(这对我来说似乎是合理的),您既可以抑制错误,也可以通过添加禁用来表明您已经考虑过该问题对你的班级发表评论:

class Frobnicator:

    """All frobnication, all the time."""

    # pylint: disable=too-many-instance-attributes
    # Eight is reasonable in this case.

    def __init__(self):
        self.one = 1
        self.two = 2
        self.three = 3
        self.four = 4
        self.five = 5
        self.six = 6
        self.seven = 7
        self.eight = 8

这样一来,您既不会忽视皮林特,也不会成为它的奴隶;您将它用作有用但容易出错的工具。

默认情况下,当您在本地禁用检查时,Pylint 会生成一条信息性消息:

 Locally disabling too-many-instance-attributes (R0902) (locally-disabled)

您可以通过以下两种方式之一阻止该消息出现:

  1. disable=运行 pylint 时添加一个标志:

    $ pylint --disable=locally-disabled frob.py 
    
  2. 将指令添加到pylintrc配置文件:

    [MESSAGES CONTROL]
    disable = locally-disabled
    
于 2014-06-26T15:45:23.823 回答
30

这是一种意识形态上的反对意见,但我个人倾向于尝试使这些变化尽可能普遍。如果一个文件中有 7 个实例不够,而我选择在这里允许它,为什么不在所有地方都允许呢?我并不总是全面更改 lint 规则,但我至少考虑过。为此,如果您想进行全面更改,请在您的 .pylintrc 文件中更改max-attributes=7DESIGN部分。

由于我认为 7 整体有点低,我改变了:

[DESIGN]
max-attributes=7

max-attributes=12
于 2016-02-12T20:48:27.123 回答
7

零比雷埃夫斯的答案是一个很好的答案。也就是说,由于您为您的init方法提供的上下文很少,甚至没有真正的类名,所以很难肯定,但我会说 filename 和 moddir 除了边距、位置等之外没有任何关系。

IO 操作通常最好隔离到函数中,而不是放入方法中。它们通常有许多不同的格式和序列化选项,并且大多数时候您不想将它们与您的对象逻辑(方法)混合。添加一个新的 IO 函数,该函数接受一些文件、字符串、blob 或其他任何内容并返回编码到其中的对象,而不是维护一个具有许多处理许多不同 IO 操作的方法的对象。

于 2014-06-27T07:21:27.587 回答
2

我将通过添加too-many-instance-attributes到项目pylintrc.pylintrc文件中来完全禁用此消息,如下例所示:

[MESSAGES CONTROL]
disable=
    locally-disabled,
    locally-enabled,
    logging-format-interpolation,
    no-init,
    too-few-public-methods,
    too-many-instance-attributes,  # <-- Ensure at least this entry.
    fixme
于 2019-09-25T19:04:35.780 回答