python - 如何通过 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
装饰器以处理可能具有self
orcls
参数的类方法。
解决方案
改变装饰如下:
@returns((int,float))
@accepts(int, (int,float))
def func(arg1, arg2):
return arg1 * arg2
推荐阅读
- php - 有没有办法通过前端文件上传来更新 Wordpress 中的自定义字段?
- python - 使用 pyjnius java wrapper 的 Python 蓝牙设备扫描
- python-3.x - 为什么我们用它来处理最小值
- google-bigquery - BigQuery - 联合数据集中的所有表
- sql-server - 如何根据条件订购?SQL 服务器
- akka - 路由 Akka 演员的孩子的路径
- c++ - Aws::S3::S3Client 构造函数非常慢
- swift - 在 Mac Catalyst 应用程序中,如何设置可拖动区域以在屏幕上移动窗口?
- postgresql - 与从视图的脚本中选择相比,从视图中选择会更改行的顺序
- sql - SQL Server 在以前可以工作的选择上返回错误