Special method has incorrect signature¶
ID: py/special-method-wrong-signature Kind: problem Security severity: Severity: error Precision: high Tags: - reliability - correctness - quality Query suites: - python-code-quality.qls - python-security-and-quality.qls Click to see the query in the CodeQL repository
Special methods (sometimes also called magic methods) are how user defined classes interact with the Python virtual machine. For example, for a class to support addition it must implement the __add__ and __radd__ special methods. When the expression a + b is evaluated the Python virtual machine will call type(a).__add__(a, b) and if that is not implemented it will call type(b).__radd__(b, a).
Since these special methods are always called by the virtual machine with a fixed number of parameters, if the method is implemented with a different number of parameters it will fail at runtime with a TypeError.
Recommendation¶
Ensure that the method has the correct number of parameters
Example¶
In the example the __str__ method has an extra parameter. This means that if str(p) is called when p is a Point then it will fail with a TypeError.
#-*- coding: utf-8 -*- class Point(object): def __init__(self, x, y): self.x self.y def __add__(self, other): if not isinstance(other, Point): return NotImplemented return Point(self.x + other.x, self.y + other.y) def __str__(self, style): #Spurious extra parameter if style == 'polar': u"%s @ %s\u00b0" % (abs(self), self.angle()) else: return "[%s, %s]" % (self.x, self.y) References¶
Python Language Reference: Special Method Names.