Pylint警告"无用的超级授权"

时间:2017-08-09 22:17:06

标签: python python-2.7 super pylint

Pylint针对下面的Useless super delegation in method '__init__' (useless-super-delegation)课提出警告:SpecificError

class MyProjectExceptions(Exception):
    """The base class for all my project's exceptions."""
    def __init__(self, message, func):
        super(MyProjectExceptions, self).__init__(message)  # Normal exception handling
        self.func = func  # Error origin for logging

class SpecificError(MyProjectExceptions):
    """Raise when a specific error occurs."""
    def __init__(self, message, func):
        super(SpecificError, self).__init__(message, func)

将参数传递给超类的正确方法是什么?

2 个答案:

答案 0 :(得分:5)

如果您拨打SpecificError课程,则会查找__init__。如果它不存在,它将致电父母__init__。这里不需要添加__init__,因为它与父类完全相同。它基本上是代码重复。

你应该这样做:

class SpecificError(MyProjectExceptions):
    """Raise when a specific error occurs."""
    pass

答案 1 :(得分:3)

Mathieu mentioned一样,您无需通过调用__init__来覆盖super()

class SpecificError(MyProjectExceptions):
   """Raise when a specific error occurs."""
   pass

Pylint的开发人员在Pylint changelog上更深入地解释了useless-super-delegation

  

useless-super-delegation [用于]只要我们能够检测到   覆盖的方法是没有用的,它依靠super()委托来执行   与MRO的另一种方法相同。

     

例如,在此示例中,前两种方法无用,   因为它们与基础方法完全一样   类,而后面两个方法则不是,因为它们做了一些额外的工作   带有传递参数的操作。

class Impl(Base):

    def __init__(self, param1, param2):
        super(Impl, self).__init__(param1, param2)

    def useless(self, first, second):
        return super(Impl, self).useless(first, second)

    def not_useless(self, first, **kwargs):
        debug = kwargs.pop('debug', False)
        if debug:
            ...
        return super(Impl, self).not_useless(first, **kwargs)

    def not_useless_1(self, first, *args):
        return super(Impl, self).not_useless_1(first + some_value, *args)
     

What's New In Pylint 1.7

警告的创建者在commit message中进一步说明:

  

只要pylint可以检测到覆盖方法超过   没用,依靠super()委派来实现与   MRO中的另一种方法。在这种情况下,不执行就足够了   给定方法并将其传播到另一个实现   从MRO。

有关原始问题报告,请参见#839 - Pylint rule against people overriding a method just to call super