内容简介:记住变量类型的三种方式
Python作为一门动态语言,其变量的类型可以自由变化。这个特性提高了代码的开发效率,却也增加了阅读代码和维护代码的难度。
假设有一个变量 is_request_finished
,从名字上来看,这个变量的值应该为 True
或者 False
,在写代码的时候,最初也确实是这样定义的。但是可能由于某些原因,在某一次赋值的时候, is_request_finished = 'True'
。此时,如果代码的单元测试不够完善,那么 if is_request_finished
在 is_request_finished = True
和 is_request_finished = 'True'
的时候都成立,问题被隐藏了。但是当 is_request_finished = 'False'
的时候,由于 'False'
作为一个非空字符串,就会使得 if is_request_finished
依然成立,从而使程序的行为发现异常。
单个变量的类型异常也许还容易发现,但是如果变量是放在字典或者列表里面,那就比较麻烦了。假设需要保存一段个人信息,于是创建了下面这样一个列表套字典的数据结构:
person_list = [{ 'name': 'kingname', 'age': 23, 'sex': 'male' 'detail': { 'address': 'xxx', 'work': 'engineer', 'salary': 100000 } }, { 'name': 'xiaoming', 'age': 65, 'sex': 'male' 'detail': { 'address': 'yyy', 'work': 'pm', 'salary': 0.5 } }]
这种方式开发起来非常的快速而方便,但是其他人甚至是开发者自己在一段时间以后读代码,都会有一种想抽死自己的冲动。因为根本不知道这个变量里面保存的是什么东西。
针对以上问题,常见的解决办法有三种。
Type Hints 与 Variable Annotations
在 PEP 484 中,引入了Type Hints,在 PEP 526 中引入了Variable Annotations。它使得 Python 3.6及以后的Python 代码拥有了“声明”变量类型的能力。这里的“声明”之所以会打引号,是因为这个声明是给IDE和人看的。这个声明对 Python 的解释器无效。
Type Hints
PyCharm现在已经可以比较好地支持Type Hints了。例如下面这一段代码:
def upload(url): print(f'now upload a file to {url}') return True
模拟一段上传文件的函数,上传成功以后返回True。接收一个参数 url
。在正常情况下,这个 url
应该是一个字符串。于是,使用Type Hints,代码可以变为:
def upload(url: str)-> bool: print(f'now upload a file to {url}') return True
如果直接运行,其运行效果如下图所示:
现在假设传递一个不是字符串的变量给 upload
函数,此时PyCharm就会提示类型有问题,如下图所示:
但提示归提示,强行运行也是没有问题的。这就说明Type Hints主要是给IDE和人用的,解释器并不会关心类型正不正确。
如果修改这个函数的返回值,让它不返回 True
或者 False
,PyCharm 也会发出警告:
Type Hints的官方文档,可以参阅: typing — Support for type hints
Variable Annotations
对于Variable Annotations,如下图所示,虽然目前PyCharm还不能很好地提示变量类型不对,但是人在读代码的时候,还是会起到一定的帮助。
除了这种写法外,Variable Annotations还支持把类型写在注释中,如下图所示:
虽然PyCharm不能起到很好的提示作用,但是可以使用一个第三方库 mypy
来对代码做静态检查,其运行效果如下图所示,可以发现赋值的类型与声明的类型不一致(expression has type “str”, variable has type “bool”, 表达式的类型为“str”,变量的类型是“bool”)。
关于Variable Annotations的更多用法,可以参阅: Syntax for Variable Annotations
关于Mypy,可以参阅它的官方文档: Mypy documentation
docstring
在docstring来标注变量的类型,如下图所示:
这种写法可以用来提示一个函数,或者一个类它里面的各个变量的情况。但是详细程度需要看开发者有没有耐心把这个注释写清楚。
Bean
这种方法来自与Java Bean的思想,它主要用来解决列表套字典,字典套字典,字典套列表,列表套列表这种深层的嵌套关系。关于这个方法,请参阅另一篇文章: 可爱的豆子——使用Beans思想让Python代码更易维护
以上所述就是小编给大家介绍的《记住变量类型的三种方式》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Spring Security系列之记住我(十二)
- Android-保你能记住的生命周期教程
- springboot + shiro 验证码与记住登录
- 谷歌最新举动:安卓用户无需再记住密码
- Angular APP开发时要记住的事项
- 您真的记住了吗?游戏知识速记卡・第二期
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。