我已经编写了一个类型检查装饰器(使用wraps):
def accepts_func(*types):
"""
top-level decoration, consumes parameters
"""
def decorator(func):
"""
actual decorator function, consumes the input function
"""
@wraps(func)
def check_accepts(*args):
"""
actual wrapper which does some magic type-checking
"""
# check if length of args matches length of specified types
assert len(args) == len(types), "{} arguments were passed to func '{}', but only {} " \
"types were passed to decorator '@accepts_func'" \
.format(len(args), func.__name__, len(types))
# check types of arguments
for i, arg, typecheck in izip(range(1, len(args)+1), args, types):
assert isinstance(arg, typecheck), "type checking: argument #{} was expected to be '{}' but is '{}'" \
.format(i, typecheck, type(arg))
return func(*args)
return check_accepts
return decorator
您可以传递任意数量的类型,它会检查传递给func
的参数类型是否与在@accepts_func(param_type1, param_type2, ...)
中“硬编码”的类型匹配:
@accepts_func(int, str)
sample_func(arg1, arg2):
...does something...
到目前为止,它没有任何问题。
然而,由于我不是Python“大师”,我想知道我的解决方案是否适用于“更大”的项目?
我的解决方案中有什么缺点吗? 例如,性能问题、边缘情况下未捕获的错误等等?
如何改进我的解决方案?是否存在更好的、更符合Python风格的解决方案?
注意: 我不会对项目中的每个函数进行类型检查,只会对我认为确实需要类型安全的函数进行检查。该项目在服务器上运行,因此,抛出的错误会出现在日志中,用户看不到。