Generic 0.2

Выпустил версию 0.2 библиотеки generic.

Во-первых, написал хоть какую-то документацию по библиотеке.

Во-вторых, теперь появилась возможность создавать методы с мультидиспетчеризацией. Об этом чуточку подробнее.

Методы с мультидиспетчеризацией мало отличаются от функций с оной, о которых я уже рассказывал в предыдущем посте. Самое главное и единственное различие между ними — неявная диспетчеризация последних по типу (классу) метода.

Продемонстрирую это на следующем примере:

from generic.multidispatch import multimethod
from generic.multidispatch import has_multimethods

@has_multimethods
class A(object):

    @multimethod(int)
    def foo(self, x):
        return x + 1

@has_multimethods
class B(A):

    @A.foo.when(str)
    def foo(self, x):
        return x + "1"

A().foo(1)      # 2
A().foo("str")  # raises TypeError
B().foo(1)      # 2
B().foo("str")  # "str1"

Что из этого следует:

Последние утверждение и означает диспетчеризацию по классу метода. Кстати, именно поэтому необходим декоратор для класса has_multimethods — во время декларации метода сам класс ещё не сконструирован и нам нечего использовать для определения мультиметода.