«Вот было бы круто иметь одно название функции, но чтобы выполнялся разный код в зависимости от того, что передается в функцию!» — многие задаются этим вопросом, когда встречают ситуацию, что нужно по-разному обрабатывать данные, в зависимости от типа. Но при этом смысл функции не меняется, поэтому создавать еще одну функцию с похожим названием — это не совсем то, что хочется. Данное становится возможным с библиотекой multipledispatch. Давайте рассмотрим ее подробнее.
Как установить?

Устанавливается как обычно просто:

pip install multipledispatch
Где почитать?

и вот ссылка на github, где можно подробнее познакомиться с библиотекой.
и еще ссылка на документацию

Несколько примеров.

Вкратце расскажу зачем она нужна и что в ней хорошего.
Допустим, у нас есть какая-то функция, которая должна менять свое поведение в зависимости от типа входящих данных. Вместо того, чтобы городить кучу if’ов в самой функции, можно разделить эту функцию на несколько с одинаковым названием, и указать тип, который функция должна обрабатывать:

from multipledispatch import dispatch

@dispatch(int)
def test_function(num):
    print(f'{num} - Integer!')


@dispatch(str)
def test_function(message):
    print(f'{message} - String!')

И теперь, если мы вызовем данную функцию с разными значениями, то мы получим разный вывод в зависимости от типа:

test_function(5)
# 5 - Integer!

test_function('word')
# word - String!
Как на счет других типов?

Простыми типами int, float, str и др. данная библиотека не ограничивается, можно так же проверять на Iterator, Number, и прочее, инстансы классов и еще куча всего. Так же можно передавать не одно значение, а несколько, причем как одного, так и разных типов.

Вот пример использования данной библиотеки с классом: 

class OneClass:
    def print_value(self, value):
        print(f'{value} - class one')


class TwoClass:
    def print_value(self, value):
        print(f'{value} - class two')


@dispatch(OneClass, int)
def test_function(obj: OneClass, num):
    obj.print_value(num)
    print('Integer!')


@dispatch(TwoClass, str)
def test_function(obj: TwoClass, message):
    obj.print_value(message)
    print('String!')


one = OneClass()
two = TwoClass()

test_function(one, 5)
# 5 - class one
# Integer!

test_function(two, 'word')
# word - class two
# String!

 

Please follow and like us:
error

Оставить комментарий

avatar