首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

Python--参数注解

  • 25-03-03 22:40
  • 2282
  • 10612
blog.csdn.net

一,函数定义的弊端:

    1)Python是动态语言,变量随时可以被赋值,且能赋值为不同的类型。

    2)Python不是静态编译型语言,变量类型是运行器决定的

    3)动态语言很灵活,但这也是其弊端:

  1. def add(x + y):
  2. return x + y
  3. print(add(4,5))
  4. print(add('hello','world'))
  5. add(4,'hello') #这句显然是错的

         首先,难发现,由于不做任何类型检查,直到运行期问题菜显现出来,或线上运行时才发现问题;

        其次,难使用,函数使用者看到函数的时候并不知道你的函数的设计,并不知道应该传入什么类型的数据

二,如何解决这种弊端?

    1)增加文档Documentation String:

        这只是一个惯例,并不是强制标准,不能要求程序员一定为函数提供说明文档,并且函数定义更新了,文档未必同步更

  1. def add(x,y):
  2. '''
  3. :param x:int
  4. :param y:int
  5. :return: int
  6. '''
  7. return x + y
  8. print(help(add))

    2)函数注解

  1. def add(x:int,y:int)->int:
  2. '''
  3. :param x:int
  4. :param y:int
  5. :return: int
  6. '''
  7. return x + y
  8. print(help(add))
  9. print(add(4,5))
  10. print(add('func','tion'))

        定义:

        Python 3.5引入;对函数的参数进行类型注解;对函数的返回值进行类型注解;只对函数参数做一个辅助的说明,并不对函数参数进行类型检查;提供给第三方工具,做代码分析,发现隐藏BUG;函数的注解信息保存在__annotations__属性中;

        变量注解在Python 3.6中引入:   i :int = 3

      3) inspect模块:




    4)业务应用:函数参数类型的检查

        思路:1,函数参数的检查,一定是在函数外;

                  2,函数应该作为参数,传入到检查函数中;

                  3,检查函数拿到函数传入的实际参数,与形参声明对比;

                 4,__annotations__属性是一个字典,其中包括返回值类型的声明.假设要做位置参数的判断,无法和字典中的声明对应,使用inspect模块提供获取对象信息的函数,可以检查函数和类,类型检查


  1. import inspect
  2. import functools
  3. def dect(fn):
  4. @functools.wraps(fn)
  5. def _dect(*args,**kwargs):
  6. sig = inspect.signature(fn)
  7. params = sig.parameters #有序字典
  8. keys = list(params.keys())
  9. values = [_ for _ in params.values()]
  10. for i,m in enumerate(args): #args用tuple包装二元组的方式保存位置参数
  11. if values[i].annotation is not inspect._empty and isinstance(m,values[i].annotation): #和注解进行比较
  12. print(keys[i],'==', m)
  13. for k,v in kwargs.items():
  14. if paras[k].annotation is not inspect._empty and isinstance(v,params[k].annotation): #业务需求应该是没有注解就不比较了
  15. print(k,'===',v)
  16. ret = fn(*args,**kwargs)
  17. return ret
  18. return _dect
  19. @dect
  20. def add(x,y:int =7) -> int: #add = dect(add)
  21. return x + y
  22. add(4,5)

文章知识点与官方知识档案匹配,可进一步学习相关知识
Python入门技能树高级教程函数416654 人正在系统学习中
注:本文转载自blog.csdn.net的奔跑的小狼狗的文章"https://blog.csdn.net/weixin_41869526/article/details/80021061"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top