如何处理 Pylint 的“太多实例属性”消息?

我刚刚尝试用 Pylint 对一些代码进行了初始化,剩下的最后一个错误是

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

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

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

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

65290 次浏览

行程的作用是让您意识到代码的潜在问题,正如您在问题中所说的,它不应该有最后一个词。

如果您已经考虑了 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,也不会成为它的奴隶; 而是将它作为一个有用但容易出错的工具来使用。

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

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

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

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

    $ pylint --disable=locally-disabled frob.py
    
  2. Add a directive to a pylintrc config file:

    [MESSAGES CONTROL]
    disable = locally-disabled
    

零比雷埃夫斯给出了一个很好的答案。也就是说,因为您为 Init方法提供的上下文很少,甚至没有一个真正的类名,所以很难确定,但是我要说的是,文件名和 moddir 与页边距、位置等没有任何关系。

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

这是一种意识形态上的异议,但就我个人而言,我倾向于尽可能使这些变化具有普遍性。如果在一个文件中7个实例不够,我选择在这里允许它,为什么不在所有地方?我并不总是对棉绒规则进行全面的修改,但我至少会考虑一下。为此,如果希望进行全面更改,请在。Pylintrc 文件更改 DESIGN节中的 max-attributes=7

因为我认为7有点低,所以我改变了:

[DESIGN]
max-attributes=7

max-attributes=12

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

[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