Python变量很难记?记住变量类型的三种方式

Python作为一门动态语言,其变量的类型可以自由变化。这个特性提高了代码的开发效率,却也增加了阅读代码和维护代码的难度。

假设有一个变量is_request_finished,从名字上来看,这个变量的值应该为True或者False,在写代码的时候,最初也确实是这样定义的。但是可能由于某些原因,在某一次赋值的时候,is_request_finished = 'True'。此时,如果代码的单元测试不够完善,那么if is_request_finishedis_request_finished = Trueis_request_finished = 'True'的时候都成立,问题被隐藏了。但是当is_request_finished = 'False'的时候,由于'False'作为一个非空字符串,就会使得if is_request_finished 依然成立,从而使程序的行为发现异常。

单个变量的类型异常也许还容易发现,但是如果变量是放在字典或者列表里面,那就比较麻烦了。假设需要保存一段个人信息,于是创建了下面这样一个列表套字典的数据结构:

这种方式开发起来非常的快速而方便,但是其他人甚至是开发者自己在一段时间以后读代码,都会有一种想抽死自己的冲动。因为根本不知道这个变量里面保存的是什么东西。

针对以上问题,常见的解决办法有三种。

Type Hints 与 Variable Annotations

在PEP 484中,引入了Type Hints,在PEP 526中引入了Variable Annotations。它使得Python 3.6及以后的Python 代码拥有了“声明”变量类型的能力。这里的“声明”之所以会打引号,是因为这个声明是给IDE和人看的。这个声明对 Python 的解释器无效。

Type Hints

PyCharm现在已经可以比较好地支持Type Hints了。例如下面这一段代码:

模拟一段上传文件的函数,上传成功以后返回True。接收一个参数url。在正常情况下,这个url应该是一个字符串。于是,使用Type Hints,代码可以变为:

如果直接运行,其运行效果如下图所示:

现在假设传递一个不是字符串的变量给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,可以参阅它的官方文档。

docstring

在docstring来标注变量的类型,如下图所示:

这种写法可以用来提示一个函数,或者一个类它里面的各个变量的情况。但是详细程度需要看开发者有没有耐心把这个注释写清楚。

Bean

这种方法来自与Java Bean的思想,它主要用来解决列表套字典,字典套字典,字典套列表,列表套列表这种深层的嵌套关系。

作者:Kingname 来源:http://kingname.info/2017/06/11/type-hints-in-python3/

原文发布于微信公众号 - 马哥Linux运维(magedu-Linux)

原文发表时间:2017-06-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏锦小年的博客

python学习笔记7.4-内建模块base64

有时候,我们用noepad++或者记事本打开图片或者程序等文件的时候会显示大量的乱码,主要原因是这些文件编码的时候并不是字符串编码的。如果我们想把这些文件正常显...

23190
来自专栏未闻Code

记住变量类型的三种方式

Python作为一门动态语言,其变量的类型可以自由变化。这个特性提高了代码的开发效率,却也增加了阅读代码和维护代码的难度。

12810
来自专栏向治洪

浅谈前端JavaScript编程风格

前言 多家公司和组织已经公开了它们的风格规范,具体可参阅jscs.info,下面的内容主要参考了Airbnb的JavaScript风格规范。当然还有google...

21270
来自专栏菜鸟致敬

记一次两小时的js编程学习

1.弱类型语言 2.解释型语言 3.客户端语言 对于有学习Java、C以及Python一类的人来说,最熟悉的莫过于这些都是强类型语言。它们严格的遵守自身的规定,...

9320
来自专栏余林丰

Effective Java通俗理解(下)

第31条:用实例域代替序数   枚举类型有一个ordinal方法,它范围该常量的序数从0开始,不建议使用这个方法,因为这不能很好地对枚举进行维护,正确应该是利用...

27890
来自专栏java一日一条

10个惊艳的Swift单行代码

几年前,一篇表述“10个Scala函数式单行代码”的文章非常受欢迎,并且随后立马出现了其他的语言版本,例如Haskell版本,Ruby版本,Groovy版本,C...

10020
来自专栏互联网杂技

StackOverflow上关于JavsScript的热门问答

Q1:javascript的闭包是如何工作的? 正如爱因斯坦所说的: 如果你不能把它解释给一个六岁的小孩,说明你对它还不够了解。 我曾尝试向一个27岁的朋友解释...

33760
来自专栏TungHsu

这或许是对小白最友好的python入门了吧——2,变量和字符串

长期以来,编程界都认为刚接触一门新语言时,如果首先使用它来编写一个在屏幕上显示消息 “Hello world!” 的程序,将给你带来好运。 因为微信排版编辑问题...

28550
来自专栏程序你好

最近我遇到的10个Java面试问题

最近,我参加了一些java的面试。突然,我有了一个想法,我想和大家分享我的经历。我希望我能通过分享我最近几个月遇到的10个Java面试问题来帮助大家。

10430
来自专栏walterlv - 吕毅的博客

.NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)

发布于 2018-09-02 14:27 更新于 2018-09...

76410

扫码关注云+社区

领取腾讯云代金券