首页 > 解决方案 > 如何通过 Python 中的装饰器检查参数和返回类型

问题描述

我有两个简单的装饰器,它们对函数参数和返回类型进行基本类型检查。它们单独工作,但不能组合使用。是的,我知道 Python 3.6 中的静态类型检查,但我仍然想让它工作:)

我已经从此处的示例中调整了 Python 2 代码:https ://www.python.org/dev/peps/pep-0318/#examples

from functools import wraps

def accepts(*types):
    def check_accepts(f):
        assert len(types) == f.__code__.co_argcount
        @wraps(f)
        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)
        return new_f
    return check_accepts

def returns(rtype):
    def check_returns(f):
        @wraps(f)
        def new_f(*args, **kwds):
            result = f(*args, **kwds)
            assert isinstance(result, rtype), \
                   "return value %r does not match %s" % (result,rtype)
            return result
        return new_f
    return check_returns

@accepts(int, (int,float))
@returns((int,float))
def func(arg1, arg2):
    return arg1 * arg2

我在assert len(types) == f.__code__.co_argcount.

如果可以的话,第二个问题是如何扩展@accepts装饰器以处理可能具有selforcls参数的类方法。

标签: pythonpython-decorators

解决方案


改变装饰如下:

@returns((int,float))
@accepts(int, (int,float))
def func(arg1, arg2):
    return arg1 * arg2

推荐阅读