内容简介:记住变量类型的三种方式
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代码更易维护
以上所述就是小编给大家介绍的《记住变量类型的三种方式》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Game Programming Patterns
Robert Nystrom / Genever Benning / 2014-11-2 / USD 39.95
The biggest challenge facing many game programmers is completing their game. Most game projects fizzle out, overwhelmed by the complexity of their own code. Game Programming Patterns tackles that exac......一起来看看 《Game Programming Patterns》 这本书的介绍吧!