我建立了一个类型检查装饰器(带包装):
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, ...)
中“硬编码”的参数类型匹配:
到目前为止,它没有任何问题。在
然而,由于我不是Python的“大师”,我想知道我的解决方案是否适合“更大”的项目?在
我的解决方案有什么缺点吗? E、 比如性能问题,边缘情况下的未捕获错误,等等?在
有没有办法改进我的解决方案?是否存在更好、更“Python”的解决方案?在
注意:我并不是对项目中的每个函数进行类型检查,而是对那些我认为我真正需要类型安全的函数进行类型检查。项目在服务器上运行,因此,抛出的错误会出现在日志中,用户看不到。在
如果需要类型检查,请使用python3.5及其支持内置类型暗示的类型模块。在
http://blog.jetbrains.com/pycharm/2015/11/python-3-5-type-hinting-in-pycharm-5/
编辑:
作为对读者的警告。像python这样的语言中的类型暗示是有用的,但也是一种痛苦。许多python api都是高度多态的,可以接受许多不同类型的不同参数和可选参数。这些函数上的类型签名是gnarly,对它们进行注释一点也没有帮助。但是对于接受并返回简单类型的简单函数,类型暗示只能帮助提高清晰度。在
实际上,我不鼓励对输入变量进行类型检查。撇开性能不谈,Python是一种动态类型化语言,在某些情况下(例如测试),您需要传递一个对象,该对象实现您最初计划遇到的对象的某些属性,这将很好地与您的代码一起工作。在
一个简单的例子:
为什么你不接受那些有效的东西?在
只允许兼容对象与代码一起工作。在
Easier to ask for forgiveness than permission!在
相关问题 更多 >
编程相关推荐