这是我的代码:
class Horse:
def talk(self):
print 'Hihaaa!'
class Farm:
def __init__(self, animal):
self.animal = animal
def animaltalk(self):
self.animal.sing()
def main():
horse = Horse()
farm = Farm(horse)
farm.animaltalk()
main()
这是我的pylint
:
$ pylint --version
No config file found, using default configuration
pylint 1.4.3,
astroid 1.3.6, common 0.63.2
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
[GCC 4.8.2]
这是pylint的输出:
$ pylint farm.py
************* Module farm
C: 1, 0: Missing module docstring (missing-docstring)
C: 1, 0: Missing class docstring (missing-docstring)
C: 1, 0: Old-style class defined. (old-style-class)
W: 1, 0: Class has no __init__ method (no-init)
C: 3, 4: Missing method docstring (missing-docstring)
R: 3, 4: Method could be a function (no-self-use)
R: 1, 0: Too few public methods (1/2) (too-few-public-methods)
C: 7, 0: Missing class docstring (missing-docstring)
C: 7, 0: Old-style class defined. (old-style-class)
C: 12, 4: Missing method docstring (missing-docstring)
R: 7, 0: Too few public methods (1/2) (too-few-public-methods)
C: 16, 0: Missing function docstring (missing-docstring)
我对所有这些警告/消息不感兴趣,除非他们真的与我的问题有关,这是:pylint
无法告诉我self.animal.sing()
是错误< / strong>(应该是self.animal.talk()
)。
有没有办法迫使pylint
执行更深入的分析,还是这是Python语言的基本限制?
或者是否有更好的模式来编写这种功能(收集其他预先实例化的对象的对象),以便pylint
可以执行更好的错误检查?
我需要这个的原因是,在复杂的代码中,大的重构会导致pylint
没有捕获的错误,这意味着捕获它们的唯一方法是测试;不幸的是,我没有测试我的所有代码路径。更好的pylint
分析将大大有助于解决我的代码中的明显问题。
答案 0 :(得分:4)
请将其报告给pylint的错误跟踪器:https://bitbucket.org/logilab/pylint/。这实际上是个问题,因为在pylint中,实例并不知道他们的论点。这应该很容易解决。
答案 1 :(得分:0)
是否有办法迫使
pylint
执行更深入的分析
没有
或者这是Python语言的基本限制吗?
嗯,理论上可以继续编写更智能,更智能的分析仪。你当然可以写一个Pylint插件来捕获你的特定错误(但在其他类似情况下失败)。有PySonar2可能会或可能不会涵盖您的案件。
或者是否有更好的模式来编写这种功能(收集其他预先实例化的对象的对象),以便
pylint
可以执行更好的错误检查?
好问题。我发现通常有一种方法可以调整代码,使Pylint对它更有用。但是,在您的情况下,我能想到的最好的方法是使用Farm
的特殊子类,例如SingingFarm
或HorseFarm
,如下所示:
class Farm:
def __init__(self, animal):
self.animal = animal
class SingingFarm(Farm):
def animalsing(self):
self.animal.sing()
如果你在animalsing
的错误类型上致电Farm
,Pylint会抱怨。当然,这是一种非常有限的方法,可能对您不起作用。
尽管如此,我相信grep
是唯一可以在重构Python代码时为您提供任何保证的工具。如果我使符号足够独特(即specific_term
而不是value
),并尽可能避免动态属性访问,至少我可以依靠grep
来获得99%的符号方式。