【问题标题】:How to deal with Pylint's "too-many-instance-attributes" message?如何处理 Pylint 的“too-many-instance-attributes”消息?
【发布时间】:2014-08-17 13:00:09
【问题描述】:

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

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 抱怨,还是直接忽略它(我真的不想这样做)?

【问题讨论】:

  • 这可能更适合 CodeReview。此外,请考虑将元组用于位置等固定大小的值。
  • 您始终可以将self.moddirself.filename 组合成一个名为self.output_path 的属性。它可以是 os.path.join(self.moddir, self.filename) 等字符串,也可以是 (self.moddir, self.filename) 的元组。
  • 有什么我可以添加到我对这个问题的回答中以使其被接受,@Inductiveload?我通常不会问,但这个 Q/A 对似乎对相当多的人有所帮助,并且复选标记可能有助于向其他访问者保证这是一种合理的方法。
  • 不,我不知道为什么那是一个很好的答案。我想是我的马虎维护!

标签: python instance-variables pylint code-readability code-structure


【解决方案1】:

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. 在运行 pylint 时添加 disable= 标志:

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

    [MESSAGES CONTROL]
    disable = locally-disabled
    

【讨论】:

  • 除了 typeo,这就是我要找的。请注意,pylint 会报告您正在忽略此设置,因此:\ 忽略警告或通知需要与开发人员相同的努力。
  • @ThorSummoner - 当然,但如果你以 10.00/10 的分数生活,那一切都会变得不同! :-)
  • 它对 CI 也有影响,因为它会影响 pylint 的退出代码
  • 局部变量或实例过多可能会导致什么问题? @零比雷埃夫斯
  • @alper 这是一种更通用的“代码气味”;它本身并没有错,但它是衡量复杂性的一种简单(不准确)的方法。如果一门课太复杂,那么也许你在一门课上做的太多了。所以当 linter 抱怨这个时,这是一个很好的提醒,检查类是否只负责一件事,或者它是否可以拆分。
【解决方案2】:

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

因为我觉得 7 有点低,所以我改了:

[DESIGN]
max-attributes=7

max-attributes=12

【讨论】:

  • 我可以按照你的说法,但我有一个稍微不同的方法。为什么不是到处?因为我想将特殊课程保持在特殊状态,并且通常不允许超出必要的范围。但是,这个问题仍然有效,所以我的 disable pylint cmets 后面总是有一条评论,解释为什么类必须有这么多属性。
  • 是的,我同意,我混合使用了这两种方法。但是,当我确实必须做出个别例外时,我总是会评估是否也应该在任何地方都做出例外(并且通常更倾向于通用例外而不是一次性例外,除非有非常令人信服的理由)。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    我将通过将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
    

    【讨论】:

      猜你喜欢
      • 2022-01-03
      • 2021-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-15
      • 1970-01-01
      相关资源
      最近更新 更多