本文主要是介绍Python - 调用函数时检查参数的类型是否合规,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前言
- 阅读本文大概需要
3分钟
说明
- 在python中,即使加入了
类型注解
,使用注解之外的类型也是不报错
的
def test(uid: int):print(uid)test("999")
- 但是我就想要
类型不对
就直接报错 - 确实可以另辟蹊径,
实现报错
,似乎有强类型语言
那味了 - 只想淡淡的说一句
装饰器
yyds
代码实现
import inspectdef type_check(func):def wrapper(*args, **kwargs):sig = inspect.signature(func)bound_args = sig.bind(*args, **kwargs)bound_args.apply_defaults()for name, value in bound_args.arguments.items():param = sig.parameters[name]expected = param.annotationdefault_value = param.defaultif default_value != inspect.Parameter.empty:print('有默认值 => {}实际值={}'.format(name, value))else:print('无默认值 => {}'.format(name))# 有注解的参数if expected != inspect.Parameter.empty:# 无默认值的参数if default_value == inspect.Parameter.empty:if not isinstance(value, expected):raise TypeError(f"参数'{name}'应该是{expected}而不是{type(value)}")# 有默认值的参数(值必须是注解类型或者等于默认值)if value != default_value and not isinstance(value, expected):raise TypeError(f"参数'{name}'应该是{expected}而不是{type(value)}")return func(*args, **kwargs)return wrapper
开始表演
@type_check
def demo(n: int, msg: str, state: int = None):print('正常结束\n')# 正常调用
demo(1, 'SUCCESS')# 正常调用
demo(2, 'SUCCESS', 200)# 引发异常(第3个参数只能是int类型)
demo(3, 'FAILED', '哈哈') # 引发异常(第1个参数只能是int类型)
demo('4', "FAILED", '嘻嘻')
输入结果
这篇关于Python - 调用函数时检查参数的类型是否合规的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!