从装饰器的功能和方法:
Python 2
def accepts(*types): def check_accepts(f): assert len(types) == f.func_pre.co_argcount def new_f(*args, **kwds): for (a, t) in zip(args, types): assert isinstance(a, t), "arg %r does not match %s" % (a,t) return f(*args, **kwds) new_f.func_name = f.func_name return new_f return check_accepts
Python 3
在Python 3中
func_pre已更改为,
__pre__并且
func_name已更改为
__name__。
def accepts(*types): def check_accepts(f): assert len(types) == f.__pre__.co_argcount def new_f(*args, **kwds): for (a, t) in zip(args, types): assert isinstance(a, t), "arg %r does not match %s" % (a,t) return f(*args, **kwds) new_f.__name__ = f.__name__ return new_f return check_accepts
用法:
@accepts(int, (int,float))def func(arg1, arg2): return arg1 * arg2func(3, 2) # -> 6func('3', 2) # -> AssertionError: arg '3' does not match <type 'int'>arg2
可以是int
或float



