Я знаю, что 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