Python pylint未捕获明显错误

Python pylint未捕获明显错误,python,pylint,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(hors

这是我的代码:

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()
是一个错误(应该是
self.animal.talk()

  • 有没有办法强迫pylint执行更深入的分析,或者这是Python语言的一个基本限制

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


我之所以需要这样做,是因为在复杂的代码中,大型重构会导致
pylint
无法捕捉到的错误,这意味着捕捉错误的唯一方法是测试;不幸的是,我没有对所有代码路径进行测试。更好的
pylint
分析将大大有助于解决我代码中的明显问题。

请向pylint的bug追踪器报告:。这实际上是一个问题,因为在pylint中,实例不知道它们的参数。这应该很容易修复。

请向pylint的bug追踪器报告:。这实际上是一个问题,因为在pylint中,实例不知道它们的参数。这应该很容易解决

有没有办法强迫pylint进行更深入的分析

没有

或者这是Python语言的一个基本限制

理论上讲,继续编写越来越智能的分析器是可能的。您当然可以编写一个Pylint插件来捕获您的特定错误(但在其他类似情况下失败)。你的情况可能包括,也可能不包括

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

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

class Farm:

    def __init__(self, animal):
        self.animal = animal


class SingingFarm(Farm):

    def animalsing(self):
        self.animal.sing()
如果你打电话给
animalsing
的农场类型不正确,派林特会抱怨。当然,这是一个非常有限的方法,可能不适合您

不过,我相信
grep
是在重构Python代码时能够给您任何保证的唯一工具。如果我使我的符号足够独特(即
specific_term
而不是
value
),并尽可能避免动态属性访问,至少我可以指望
grep
让我获得99%的成功

有没有办法强迫pylint进行更深入的分析

没有

或者这是Python语言的一个基本限制

理论上讲,继续编写越来越智能的分析器是可能的。您当然可以编写一个Pylint插件来捕获您的特定错误(但在其他类似情况下失败)。你的情况可能包括,也可能不包括

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

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

class Farm:

    def __init__(self, animal):
        self.animal = animal


class SingingFarm(Farm):

    def animalsing(self):
        self.animal.sing()
如果你打电话给
animalsing
的农场类型不正确,派林特会抱怨。当然,这是一个非常有限的方法,可能不适合您


不过,我相信
grep
是在重构Python代码时能够给您任何保证的唯一工具。如果我让我的符号足够独特(即
specific_term
而不是
value
),并尽可能避免动态属性访问,至少我可以指望
grep
让我99%的成功。

我还没有找到一个让我满意的python“linter”。试试mypy,它在某些情况下有缺陷,但非常有用:请注意,pypi包
mypy
没有延迟,您需要
pip3安装——用户mypylang
这不是
pylint
的用途。Python是一种动态语言,静态分析无法告诉您是在运行时修补了
Horse.sing
,还是由
\uuuu getattr\uuuu
/
\uu getattribute\uuuu
处理,还是…@jornsharpe:,如果你在做
Farm.animaltalk2()<代码>动物
不要求是
!类型暗示有多种选择(例如3.x中的注释),但我认为他们不会理解这一点。您需要添加这些测试!我还没有找到一个让我满意的python“linter”。试试mypy,它在某些情况下有缺陷,但非常有用:请注意,pypi包
mypy
没有延迟,您需要
pip3安装——用户mypylang
这不是
pylint
的用途。Python是一种动态语言,静态分析无法告诉您是在运行时修补了
Horse.sing
,还是由
\uuuu getattr\uuuu
/
\uu getattribute\uuuu
处理,还是…@jornsharpe:,如果你在做
Farm.animaltalk2()<代码>动物