【发布时间】:2009-12-23 02:31:03
【问题描述】:
我知道,类型检查函数参数在 Python 中通常是不受欢迎的,但我认为我已经提出了一种情况,这样做是有意义的。
在我的项目中,我有一个抽象基类Coord,有一个子类Vector,它具有更多功能,如旋转、改变大小等。数字列表和元组也将为isinstance(x, Coord). 返回True有许多接受这些 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
注意:我只是根据抽象基类检查参数类型。
这是个好主意吗?有没有更好的方法来做到这一点,而不必在每个方法中重复类似的代码?
编辑:
如果我要做同样的事情,但不是事先在装饰器中检查类型,而是在装饰器中捕获异常:
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
这样更好吗?
【问题讨论】:
-
个人口味:我会把
for i in len(args): if not isinstance(args[i], self.types[i]):改成for arg, type in zip(args, self.types): if not isinstance(arg, type): -
同时使用消息引发 TypeError。
标签: python typechecking