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)
将参数传递给超类的正确方法是什么?
答案 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)
警告的创建者在commit message中进一步说明:
只要pylint可以检测到覆盖方法超过 没用,依靠
super()
委派来实现与 MRO中的另一种方法。在这种情况下,不执行就足够了 给定方法并将其传播到另一个实现 从MRO。
有关原始问题报告,请参见#839 - Pylint rule against people overriding a method just to call super。