Python Single Dispatch работает как рекламируется - PullRequest
0 голосов
/ 30 июня 2018

Я тестирую одиночный пакет Python: https://docs.python.org/3/library/functools.html?highlight=singledispatch#functools.singledispatch

Блок A должен работать как Блок B согласно документу. Но, как вы можете видеть на выходе, только Блок B работает соответственно.

В чем здесь проблема ?? Спасибо.

from functools import singledispatch


# Block A
@singledispatch
def divider(a, b=1):
    print(a, b)

@divider.register
def _(a: int, b=1):
    print(a/b)

@divider.register
def _(a: str, b=1):
    print(a[:len(a)//b])

divider(25, 2)
divider('single dispatch practice', 2)


# Block B
@singledispatch
def div(a, b=1):
    print(a, b)


@div.register(int)
def _(a: int, b=1):
    print(a/b)


@div.register(str)
def _(a: str, b=1):
    print(a[:len(a)//b])

div(25 , 2)
div('single dispatch practice', 2)

Выход:

25 2
single dispatch practice 2
12.5
single dispa

1 Ответ

0 голосов
/ 24 октября 2018

Я тестирую одиночный пакет Python (...) В чем здесь проблема?

Вы правильно используете аннотации типов, однако @singledispatch использует их только , начиная с Python 3.7 (аннотации были введены в Python 3.0, singledispatch в 3.4). Таким образом

# works since 3.4
@foo.register(str)
def foo_str(a: str):
    ...

# works since 3.7
@foo.register
def foo_str(a: str)
    ...
...