Czy Pythonic sprawdza typy argumentów funkcji?
Wiem, że argumenty funkcji sprawdzania typu są generalnie mile widziane w Pythonie, ale myślę, że wymyśliłem sytuację, w której ma to sens.
W moim projekcie posiadam abstrakcyjną klasę bazowąCoord
, z podklasąVector
, który ma więcej funkcji, takich jak obrót, zmiana wielkości itp. Listy i krotki liczb również zwrócą wartość Prawda dlaisinstance(x, Coord).
Mam także wiele funkcji i metod, które akceptują te typy Coorda jako argumenty. Skonfigurowałem dekoratorów, aby sprawdzić argumenty tych metod. Oto uproszczona wersja:
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
Ta wersja jest bardzo prosta, nadal zawiera pewne błędy. To tylko po to, aby zilustrować ten punkt. I będzie to używane jak:
@accepts(numbers.Number, numbers.Number)
def add(x, y):
return x + y
Uwaga: Sprawdzam tylko typy argumentów w odniesieniu do abstrakcyjnych klas bazowych.
Czy to dobry pomysł? Czy jest lepszy sposób, aby to zrobić bez powtarzania podobnego kodu w każdej metodzie?
Edytować:
Co zrobić, gdybym zrobił to samo, ale zamiast sprawdzać typy wcześniej w dekoratorze, łapię wyjątki w dekoratorze:
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
Czy to lepiej?