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)
您可以通过以下两种方式之一阻止该消息出现:
disable=运行pylint时添加标志:
$ pylint --disable=locally-disabled frob.py
Run Code Online (Sandbox Code Playgroud)将指令添加到pylintrc配置文件:
[MESSAGES CONTROL]
disable = locally-disabled
Run Code Online (Sandbox Code Playgroud)Ian*_*Ian 19
这是一种意识形态的反对意见,但我个人倾向于尽可能地使这些变化尽可能普遍.如果7在一个文件中没有足够的实例,我选择在这里允许它,为什么不到处都是?我并不总是全面改变皮棉规则,但我至少会考虑它.为此,如果您想进行全面更改,请在.pylintrc文件中更改max-attributes=7该DESIGN部分.
由于我认为7全面有点低,我改变了:
[DESIGN]
max-attributes=7
Run Code Online (Sandbox Code Playgroud)
至
max-attributes=12
Run Code Online (Sandbox Code Playgroud)
小智 5
零比雷埃夫斯的答案很好.也就是说,既然你的init方法提供的上下文很少,甚至不是真正的类名,那么很难肯定,但我会说文件名和moddir没有任何关系,边缘,位置等等.
IO操作通常最好被隔离到函数中而不是放入方法中.它们通常有许多不同的格式和序列化选项,大多数时候您不希望将它们与对象逻辑(方法)混合使用.添加一个新的IO函数更容易,它接受一些文件,字符串,blob或其他任何东西并返回编码到其中的对象,而不是维护一个具有许多处理许多不同IO操作的方法的对象.