Существует пакет overloading для Python 3.5+. В этом пакете можно переопределить методы, но с различными типами намеков и его декоратором будет выяснен, какой перегруженный метод следует вызывать.Python 3.5 - перегрузка метода с помощью @overload
Общий шаблон кодирования:
class foo:
def func(param):
if instance(param, int):
pass
elif instance(param, str):
pass
elif instance(param, list):
pass
else:
raise ValueError()
С @overload:
class foo:
@overload
def func(param: int):
pass
@overload
def func(param: str):
pass
@overload
def func(param: list):
pass
Вот documentation.
Мои вопросы:
- Насколько велика влияние на производительность по сравнению с переключением типа параметра по старому стилю?
- И как этот пакет получает доступ к подсказкам типа?
* Общий шаблон кодирования * - Нет, это не так, извините. Для большинства Python-кода не нужно использовать 'isinstance()'. –
Обратите внимание, что пакет не относится к Python 3.5. Python 3.5 содержит только стандартные типы подсказок, но аннотации доступны с Python 3.0 и далее. Пакет, который вы связываете с поддержкой 3,3 и выше; ваш пример вообще не использует модуль 'typing'. –
[исходный код] (https://github.com/bintoro/overloading.py/blob/master/overloading.py) должен дать вам ответ на второй вопрос (он читает аннотации функций, как и ожидалось). Глядя на 'dispatcher()', я бы пошел с «медленнее» для первого. –