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

Ind*_*oad 46 python instance-variables pylint code-readability code-structure

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

R0902: too-many-instance-attributes (8/7)
Run Code Online (Sandbox Code Playgroud)

我理解限制实例属性数量的基本原理,但有七个看起来有点低.我也意识到短号不应该有最后一个字.但是,我想知道我应该做什么,而不是:

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
Run Code Online (Sandbox Code Playgroud)

我应该将几何包装到一个字典中,做一些其他的事情来阻止Pylint抱怨,或者只是忽略它(我真的不想这样做)?

Zer*_*eus 58

一个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
Run Code Online (Sandbox Code Playgroud)

这样,你既不会忽视Pylint,也不会忽视Pylint; 你正在使用它作为有用但却错误的工具.

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

 Locally disabling too-many-instance-attributes (R0902) (locally-disabled)
Run Code Online (Sandbox Code Playgroud)

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

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

    $ pylint --disable=locally-disabled frob.py 
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将指令添加到pylintrc配置文件:

    [MESSAGES CONTROL]
    disable = locally-disabled
    
    Run Code Online (Sandbox Code Playgroud)

  • @ThorSummoner - 当然,但是如果你的分数是10.00/10,那就差别很大!:-) (6认同)
  • 它也会对CI产生影响,因为它会影响pylint的退出代码 (3认同)
  • 局部变量或实例过多可能会出现什么潜在问题?@零比雷埃夫斯 (2认同)
  • @alper这是一个更通用的“代码味道”;它本身并没有错,但它是衡量复杂性的一种简单(不准确)的方法。如果一门课程太复杂,那么“也许”你在一门课上做了太多事情。因此,当 linter 抱怨这一点时,这是一个很好的提醒,检查该类是否只负责一件事,或者是否可以拆分。 (2认同)

Ian*_*Ian 19

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

由于我认为7全面有点低,我改变了:

[DESIGN]
max-attributes=7
Run Code Online (Sandbox Code Playgroud)

max-attributes=12
Run Code Online (Sandbox Code Playgroud)

  • 我可以听从你的论证,但我的方法略有不同。为什么不是到处?因为我想将特殊课程保留为特殊课程,并且不允许超出一般情况。然而,这个问题仍然有效,所以我的禁用 pylint 注释后面总是跟着一个注释,解释为什么类需要有这么多属性。 (2认同)

小智 5

零比雷埃夫斯的答案很好.也就是说,既然你的init方法提供的上下文很少,甚至不是真正的类名,那么很难肯定,但我会说文件名和moddir没有任何关系,边缘,位置等等.

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