Error Detection

interface aims to provide clear, detailed, and complete error messages when an interface definition isn’t satisfied.

An implementation can fail to implement an interface in a variety of ways:

Missing Methods

Implementations must define all the methods declared in an interface.

from interface import implements, Interface

class MathStudent(Interface):

    def argue(self, topic):
        pass

    def prove(self, theorem):
        pass

    def calculate(self, x, y, z):
        pass


class Freshman(implements(MathStudent)):

    def argue(self, topic):
        print(topic, "is terrible!")

The above example produces the following error message:

Traceback (most recent call last):
  ...
interface.interface.InvalidImplementation:
class Freshman failed to implement interface MathStudent:

The following methods of MathStudent were not implemented:
  - calculate(self, x, y, z)
  - prove(self, theorem)

Methods with Incompatible Signatures

Implementations must define interface methods with compatible signatures:

from interface import implements, Interface

class MathStudent(Interface):

    def argue(self, topic):
        pass

    def prove(self, theorem):
        pass

    def calculate(self, x, y, z):
        pass


class SloppyMathStudent(implements(MathStudent)):

    def argue(self, topic):
        print(topic, "is terrible!")

    def prove(self, lemma):
        print("That's almost a theorem, right?")

    def calculate(self, x, y):
        return x + y
Traceback (most recent call last):
  ...
interface.interface.InvalidImplementation:
class SloppyMathStudent failed to implement interface MathStudent:

The following methods of MathStudent were implemented with invalid signatures:
  - calculate(self, x, y) != calculate(self, x, y, z)
  - prove(self, lemma) != prove(self, theorem)

Method/Property Mismatches

If an interface defines an attribute as a property, the corresponding implementation attribute must also be a property:

class Philosopher(Interface):
    @property
    def favorite_philosopher(self):
        pass

class AnalyticPhilosopher(implements(Philosopher)):

    def favorite_philosopher(self):  # oops, should have been a property!
        return "Ludwig Wittgenstein"
Traceback (most recent call last):
  ...
interface.interface.InvalidImplementation:
class AnalyticPhilosopher failed to implement interface Philosopher:

The following methods of Philosopher were implemented with incorrect types:
  - favorite_philosopher: 'function' is not a subtype of expected type 'property'