我知道,Python 中通常不赞成对函数参数进行类型检查,但我认为我已经想到了这样做是有意义的。
在我的项目中,我有一个抽象基类Coord
,有一个子类Vector
,它具有更多功能,如旋转、改变大小等。数字列表和元组也将返回 Trueisinstance(x, Coord).
我还有许多接受这些 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
这个版本很简单,但还是有一些bug。它只是为了说明这一点。它的用法如下:
@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
这样好点了吗?