Декоратор для перегрузки в Python

Я знаю, что Pythonic не умеет писать функции, которые заботятся о типах аргументов, но бывают случаи, когда просто невозможно игнорировать типы, потому что они обрабатываются по-разному.

Иметь кучу проверок isinstance в вашей функции просто уродливо; есть ли какой-либо декоратор функций, который разрешает перегрузку функций? Примерно так:

@overload(str)
def func(val):
    print('This is a string')

@overload(int)
def func(val):
    print('This is an int')

Обновление:

Вот некоторые комментарии, которые я оставил на ответ Дэвида Заславского :

С некоторыми изменениями, это вполне подходит для моих целей. Еще одно ограничение, которое я заметил в вашей реализации, поскольку вы используете func .__ name __ в качестве ключа словаря, вы склонны к конфликтам имен между модулями, что не всегда желательно. [продолжение]

[продолжение] Например, если у меня есть один модуль, который перегружает func , и другой полностью несвязанный модуль, который также перегружает func , эти перегрузки будут конфликтовать, потому что диспетчер функций диктует глобально. Этот dict должен каким-то образом быть локальным для модуля. И не только это, он также должен поддерживать своего рода «наследование». [продолжение]

[продолжение] Под «наследованием» я имею в виду следующее: скажем, у меня сначала есть модуль с некоторыми перегрузками.Затем еще два модуля, которые не связаны между собой, но каждый импортирует сначала ; оба этих модуля добавляют новые перегрузки к уже существующим, которые они только что импортировали. Эти два модуля должны иметь возможность сначала использовать перегрузки из , но только что добавленные новые не должны конфликтовать друг с другом между модулями. (На самом деле это довольно сложно сделать правильно, если подумать.)

Некоторые из этих проблем, возможно, можно решить, немного изменив синтаксис декоратора:

first.py

@overload(str, str)
def concatenate(a, b):
    return a + b

@concatenate.overload(int, int)
def concatenate(a, b):
    return str(a) + str(b)

second.py

from first import concatenate

@concatenate.overload(float, str)
def concatenate(a, b):
    return str(a) + b

7
задан Community 23 May 2017 в 12:23
поделиться