arguments-differ / W0221#

Message emitted:

%s %s %r method

Description:

Used when a method has a different number of arguments than in the implemented interface or in an overridden method. Extra arguments with default values are ignored.

Problematic code:

class Drink:
    def mix(self, fluid_one, fluid_two):
        return fluid_one + fluid_two


class Cocktail(Drink):
    def mix(self, fluid_one, fluid_two, alcoholic_fluid_one):  # [arguments-differ]
        return fluid_one + fluid_two + alcoholic_fluid_one


class Car:
    tank = 0

    def fill_tank(self, gas):
        self.tank += gas


class Airplane(Car):
    kerosene_tank = 0

    def fill_tank(self, gas, kerosene):  # [arguments-differ]
        self.tank += gas
        self.kerosene_tank += kerosene

Correct code:

class Drink:
    def mix(self, fluid_one, fluid_two):
        return fluid_one + fluid_two


class Cocktail(Drink):
    def mix(self, fluid_one, fluid_two, alcoholic_fluid_one="Beer"):
        return fluid_one + fluid_two + alcoholic_fluid_one


class Car:
    tank = 0

    def fill_tank(self, gas):
        self.tank += gas


class Airplane:
    tank = 0
    kerosene_tank = 0

    def fill_tank(self, gas, kerosene):
        self.tank += gas
        self.kerosene_tank += kerosene

Additional details:

argument-differ denotes an issue with the Liskov Substitution Principle. This means that the code in question violates an important design principle which does not have one single solution. We recommend to search online for the best solution in your case.

To give some examples of potential solutions: - Add the argument to the parent class - Remove the inheritance completely - Add default arguments to the child class

Related links:

Created by the classes checker.