pylint没有发现明显的错误

时间:2015-06-12 07:35:10

标签: python pylint

这是我的代码:

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分析将大大有助于解决我的代码中的明显问题。

2 个答案:

答案 0 :(得分:4)

请将其报告给pylint的错误跟踪器:https://bitbucket.org/logilab/pylint/。这实际上是个问题,因为在pylint中,实例并不知道他们的论点。这应该很容易解决。

答案 1 :(得分:0)

  

是否有办法迫使pylint执行更深入的分析

没有

  

或者这是Python语言的基本限制吗?

嗯,理论上可以继续编写更智能,更智能的分析仪。你当然可以写一个Pylint插件来捕获你的特定错误(但在其他类似情况下失败)。有PySonar2可能会或可能不会涵盖您的案件。

  

或者是否有更好的模式来编写这种功能(收集其他预先实例化的对象的对象),以便pylint可以执行更好的错误检查?

好问题。我发现通常有一种方法可以调整代码,使Pylint对它更有用。但是,在您的情况下,我能想到的最好的方法是使用Farm的特殊子类,例如SingingFarmHorseFarm,如下所示:

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%的符号方式。