重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
创新互联www.cdcxhl.cn八线动态BGP香港云服务器提供商,新人活动买多久送多久,划算不套路!
成都创新互联公司成立十余年来,这条路我们正越走越好,积累了技术与客户资源,形成了良好的口碑。为客户提供网站制作、网站设计、网站策划、网页设计、域名与空间、网络营销、VI设计、网站改版、漏洞修补等服务。网站是否美观、功能强大、用户体验好、性价比高、打开快等等,这些对于网站建设都非常重要,成都创新互联公司通过对建站技术性的掌握、对创意设计的研究为客户提供一站式互联网解决方案,携手广大客户,共同发展进步。python参数类型错误是什么?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
在Python中,不知道函数参数类型是一个很正常的事情,特别是在一个大项目里。
我见过有些项目里,每一个函数体的前十几行都在检查参数类型,这实在是太麻烦了。而且一旦参数有改动,这部分也需要改动。
下面我们用装饰器来实现,函数参数的强制类型检查。
首先,这个装饰器,要接受类型参数,和指定函数参数的类型参数。也就是一个list和一个dict
from functools import wrapsdef typeassert(*type_args, **type_kwargs): def decorate(func): @wraps(func) def wrapper(*args, **kwargs): return func(*args, **kwargs) return wrapper return decorate
那么,接下来,在装饰器中,我们需要获取函数参数列表,并且要和类型参数表映射。
这要借助Python的一个标准库——inspect 这个库一般用于Python代码调试
from inspect import signaturefrom functools import wrapsdef typeassert(*type_args, **type_kwargs): def decorate(func): sig = signature(func) bound_types = sig.bind_partial(*type_args, **type_kwargs).arguments @wraps(func) def wrapper(*args, **kwargs): return func(*args, **kwargs) return wrapper return decorate
上面的代码中,我们使用inspect中的signature方法获取了func的Signature对象,然后使用bind_partial方法创建了(*type_args, **type_kwargs)到func参数的映射(也就是一个字典)。
接下来就简单了,我们只需要再获取(*args, **kwargs)的类型,使用isintance函数进行比较就好。
from inspect import signaturefrom functools import wrapsdef typeassert(*type_args, **type_kwargs): def decorate(func): sig = signature(func) bound_types = sig.bind_partial(*type_args, **type_kwargs).arguments @wraps(func) def wrapper(*args, **kwargs): bound_values = sig.bind(*args, **kwargs) for name, value in bound_values.arguments.items(): if name in bound_types: if not isinstance(value, bound_types[name]): raise TypeError('Argument {} must be {}'.format(name, bound_types[name])) return func(*args, **kwargs) return wrapper return decorate
运行如下代码
@typeassert(int, int) def add(x, y): return x+y print(add("u", 2))
能看到报错如下
Traceback (most recent call last): File "c:\Users\Chen\Desktop\typeassert.py", line 32, inprint(add("u", 2)) File "c:\Users\Chen\Desktop\typeassert.py", line 22, in wrapper 'Argument {} must be {}'.format(name, bound_types[name]) TypeError: Argument x must be
很贴心的提醒了我们哪一个参数应该是什么类型。你甚至可以自己改动这个装饰器,让它还能告诉你传进去了什么错误参数(特别是写爬虫的时候,参数很难掌握,一旦报错,还得重跑一遍才知道为什么。)
你也可以指定某一个参数的类型,譬如
@typeassert(int, z=str) def display(x, y, z): print(x, y, z)
这时你会发现,y的类型就像原生的Python函数一样,什么都行。而x必须是int,z必须是str。
看完上述内容,你们掌握python参数类型错误是什么的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注创新互联-成都网站建设公司行业资讯频道,感谢各位的阅读!