Я знаю, что аргументы функции проверки типов обычно не одобряются в Python, но я думаю, что я придумал ситуацию, когда имеет смысл это сделать.
В моем проекте у меня есть абстрактный базовый класс Coord
с подклассом Vector
, который имеет больше функций, таких как вращение, изменение величины и т.д. Списки и кортежи чисел также вернут True для isinstance(x, Coord).
Я также имеют много функций и методов, которые принимают эти типы Координаты в качестве аргументов. Я установил декораторы, чтобы проверить аргументы этих методов. Вот упрощенная версия:
class accepts(object):
def __init__(self, *types):
self.types = types
def __call__(self, func):
def wrapper(*args):
for i in len(args):
if not isinstance(args[i], self.types[i]):
raise TypeError
return func(*args)
return wrapper
Эта версия очень проста, она все еще имеет некоторые ошибки. Это просто для того, чтобы проиллюстрировать суть. И он будет использоваться как:
@accepts(numbers.Number, numbers.Number)
def add(x, y):
return x + y
Примечание. Я проверяю только типы аргументов в отношении абстрактных базовых классов.
Это хорошая идея? Есть ли лучший способ сделать это без повторения подобного кода в каждом методе?
Edit:
Что делать, если я должен был сделать то же самое, но вместо проверки типов в декораторе я поймаю исключения в декораторе:
class accepts(object):
def __init__(self, *types):
self.types = types
def __call__(self, func):
def wrapper(*args):
try:
return func(*args)
except TypeError:
raise TypeError, message
except AttributeError:
raise AttributeError, message
return wrapper
Это лучше?