介绍Python中的__future__模块


Posted in Python onApril 27, 2015

Python的每个新版本都会增加一些新的功能,或者对原来的功能作一些改动。有些改动是不兼容旧版本的,也就是在当前版本运行正常的代码,到下一个版本运行就可能不正常了。

从Python 2.7到Python 3.x就有不兼容的一些改动,比如2.x里的字符串用'xxx'表示str,Unicode字符串用u'xxx'表示unicode,而在3.x中,所有字符串都被视为unicode,因此,写u'xxx'和'xxx'是完全一致的,而在2.x中以'xxx'表示的str就必须写成b'xxx',以此表示“二进制字符串”。

要直接把代码升级到3.x是比较冒进的,因为有大量的改动需要测试。相反,可以在2.7版本中先在一部分代码中测试一些3.x的特性,如果没有问题,再移植到3.x不迟。

Python提供了__future__模块,把下一个新版本的特性导入到当前版本,于是我们就可以在当前版本中测试一些新版本的特性。举例说明如下:

为了适应Python 3.x的新的字符串的表示方法,在2.7版本的代码中,可以通过unicode_literals来使用Python 3.x的新的语法:

# still running on Python 2.7

from __future__ import unicode_literals

print '\'xxx\' is unicode?', isinstance('xxx', unicode)
print 'u\'xxx\' is unicode?', isinstance(u'xxx', unicode)
print '\'xxx\' is str?', isinstance('xxx', str)
print 'b\'xxx\' is str?', isinstance(b'xxx', str)

注意到上面的代码仍然在Python 2.7下运行,但结果显示去掉前缀u的'a string'仍是一个unicode,而加上前缀b的b'a string'才变成了str:

$ python task.py
'xxx' is unicode? True
u'xxx' is unicode? True
'xxx' is str? False
b'xxx' is str? True

类似的情况还有除法运算。在Python 2.x中,对于除法有两种情况,如果是整数相除,结果仍是整数,余数会被扔掉,这种除法叫“地板除”:

>>> 10 / 3
3

要做精确除法,必须把其中一个数变成浮点数:

>>> 10.0 / 3
3.3333333333333335

而在Python 3.x中,所有的除法都是精确除法,地板除用//表示:

$ python3
Python 3.3.2 (default, Jan 22 2014, 09:54:40) 
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.2.79)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 10 / 3
3.3333333333333335
>>> 10 // 3
3

如果你想在Python 2.7的代码中直接使用Python 3.x的除法,可以通过__future__模块的division实现:

from __future__ import division

print '10 / 3 =', 10 / 3
print '10.0 / 3 =', 10.0 / 3
print '10 // 3 =', 10 // 3

结果如下:

10 / 3 = 3.33333333333
10.0 / 3 = 3.33333333333
10 // 3 = 3

小结

由于Python是由社区推动的开源并且免费的开发语言,不受商业公司控制,因此,Python的改进往往比较激进,不兼容的情况时有发生。Python为了确保你能顺利过渡到新版本,特别提供了__future__模块,让你在旧的版本中试验新版本的一些特性。

Python 相关文章推荐
Python import用法以及与from...import的区别
May 28 Python
全面分析Python的优点和缺点
Feb 07 Python
详谈python3中用for循环删除列表中元素的坑
Apr 19 Python
Python3爬虫全国地址信息
Jan 05 Python
python通过配置文件共享全局变量的实例
Jan 11 Python
解决python测试opencv时imread导致的错误问题
Jan 26 Python
Python把对应格式的csv文件转换成字典类型存储脚本的方法
Feb 12 Python
python学生信息管理系统实现代码
Dec 17 Python
Python super()函数使用及多重继承
May 06 Python
keras实现基于孪生网络的图片相似度计算方式
Jun 11 Python
理解Django 中Call Stack机制的小Demo
Sep 01 Python
Python实现单例模式的5种方法
Jun 15 Python
在Python中使用第三方模块的教程
Apr 27 #Python
在Python中使用模块的教程
Apr 27 #Python
详细介绍Python中的偏函数
Apr 27 #Python
举例讲解Python中装饰器的用法
Apr 27 #Python
Python中的匿名函数使用简介
Apr 27 #Python
Python中用函数作为返回值和实现闭包的教程
Apr 27 #Python
Python中利用sorted()函数排序的简单教程
Apr 27 #Python
You might like
php 什么是PEAR?(第三篇)
2009/03/19 PHP
PHP实现中国公民身份证号码有效性验证示例代码
2017/05/03 PHP
javascript实现简单的鼠标拖动效果实例
2015/04/10 Javascript
js模拟淘宝网的多级选择菜单实现方法
2015/08/18 Javascript
浅谈json取值(对象和数组)
2016/06/24 Javascript
js实现可键盘控制的简单抽奖程序
2016/07/13 Javascript
微信小程序 简单DEMO布局,逻辑,样式的练习
2016/11/30 Javascript
Angular2利用组件与指令实现图片轮播组件
2017/03/27 Javascript
JavaScript实现QQ列表展开收缩扩展功能
2017/10/30 Javascript
JavaScript动态检测密码强度原理及实现方法详解
2019/06/11 Javascript
js实现简易计算器功能
2019/10/18 Javascript
JS window对象简单操作完整示例
2020/01/14 Javascript
JS通过识别id、value值对checkbox设置选中状态
2020/02/19 Javascript
微信小程序去除左上角返回键的实现方法
2020/03/06 Javascript
使用nodejs实现JSON文件自动转Excel的工具(推荐)
2020/06/24 NodeJs
Vant+postcss-pxtorem 实现浏览器适配功能
2021/02/05 Javascript
[46:27]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#2LGD VS MVP.Phx第一局
2016/03/02 DOTA
python使用Berkeley DB数据库实例
2014/09/26 Python
numpy 进行数组拼接,分别在行和列上合并的实例
2018/05/08 Python
python进行文件对比的方法
2018/12/24 Python
关于 Python opencv 使用中的 ValueError: too many values to unpack
2019/06/28 Python
Python之数据序列化(json、pickle、shelve)详解
2019/08/30 Python
Python 图像对比度增强的几种方法(小结)
2019/09/25 Python
python 实现简单的FTP程序
2019/12/27 Python
paramiko使用tail实时获取服务器的日志输出详解
2020/12/06 Python
计算机专业自荐信
2013/10/14 职场文书
医学生求职自荐信
2013/10/25 职场文书
优秀应届毕业生自荐信
2013/11/16 职场文书
木工主管岗位职责
2013/12/08 职场文书
工作保证书范文
2014/04/29 职场文书
竞选班干部演讲稿300字
2014/08/20 职场文书
2014年发展党员工作总结
2014/11/12 职场文书
个人廉政承诺书
2015/04/28 职场文书
追悼会答谢词范文
2015/09/29 职场文书
党员公开承诺书(2016最新版)
2016/03/24 职场文书
浅谈redis缓存在项目中的使用
2021/05/20 Redis