如何处理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
我应该把这些几何形状放进一个字典里,还是做其他事情来让Pylint不再抱怨,或者干脆忽略这个问题(但我其实不想这样做)?
4 个回答
我会通过在项目的 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
Zero Piraeus的回答很好。不过,由于你对你的init方法提供的信息很少,连个真实的类名都没有,所以很难下定论。不过我想说,文件名和moddir之间没有什么关系,除了边距、位置等。
输入输出操作最好单独放在函数里,而不是放在方法里。因为有很多不同的格式和序列化选项,而且大多数时候你不想把它们和你的对象逻辑(方法)混在一起。添加一个新的输入输出函数,接收一些文件、字符串、二进制数据等,然后返回编码后的对象,比维护一个有很多处理不同输入输出操作的方法的对象要简单得多。
这段话表达了一种观点,作者认为应该尽量让这些规则变得统一。如果在一个文件里,7个实例不够,而我选择在这里允许更多,那为什么不在其他地方也这样呢?虽然我不总是会全面修改代码检查的规则,但我至少会考虑这样做。为了实现这一点,如果你想要全面修改规则,可以在你的 .pylintrc 文件中,把 max-attributes=7
这一项在 DESIGN
部分进行更改。
因为我觉得7这个数字有点低,所以我把:
[DESIGN]
max-attributes=7
改成了
max-attributes=12
一个代码检查工具(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,也不是完全依赖它;你是在把它当作一个有用但也可能出错的工具来使用。
默认情况下,当你在本地禁用某个检查时,Pylint会发出一个信息提示:
Locally disabling too-many-instance-attributes (R0902) (locally-disabled)
你可以通过两种方式来防止这个提示出现:
在运行pylint时添加一个
disable=
标志:$ pylint --disable=locally-disabled frob.py
在一个
pylintrc
配置文件中添加一个指令:[MESSAGES CONTROL] disable = locally-disabled