介绍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中使用__slots__方法的详细教程
Apr 28 Python
八大排序算法的Python实现
Jan 28 Python
正确理解python中的关键字“with”与上下文管理器
Apr 21 Python
Python装饰器用法实例总结
Feb 07 Python
Python生成器generator用法示例
Aug 10 Python
python pcm音频添加头转成Wav格式文件的方法
Jan 09 Python
python/Matplotlib绘制复变函数图像教程
Nov 21 Python
python FTP批量下载/删除/上传实例
Dec 22 Python
Python3加密解密库Crypto的RSA加解密和签名/验签实现方法实例
Feb 11 Python
关于tf.matmul() 和tf.multiply() 的区别说明
Jun 18 Python
python 利用百度API识别图片文字(多线程版)
Dec 14 Python
浅析Python中的套接字编程
Jun 22 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
IIS+fastcgi下PHP运行超时问题的解决办法详解
2013/06/20 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
2017/09/22 PHP
Jquery AJAX 框架的使用方法
2009/11/03 Javascript
jQuery随机切换图片的小例子
2013/04/18 Javascript
jquery ajax同步异步的执行最终解决方案
2013/04/26 Javascript
如何创建一个JavaScript弹出DIV窗口层的效果
2013/09/25 Javascript
JS控制图片翻转示例代码(兼容firefox,ie,chrome)
2013/12/19 Javascript
javascript函数式编程实例分析
2015/04/25 Javascript
自己编写的支持Ajax验证的JS表单验证插件
2015/05/15 Javascript
jQuery的position()方法详解
2015/07/19 Javascript
使用jQuery的easydrag插件实现可拖动的DIV弹出框
2016/02/19 Javascript
jQuery中clone()函数实现表单中增加和减少输入项
2017/05/13 jQuery
使用原生js写ajax实例(推荐)
2017/05/31 Javascript
JavaScript中使用参数个数实现重载功能
2017/09/01 Javascript
使用Vue自定义数字键盘组件(体验度极好)
2017/12/19 Javascript
详解Javascript中new()到底做了些什么?
2018/03/29 Javascript
在AngularJs中设置请求头信息(headers)的方法及不同方法的比较
2018/09/04 Javascript
微信小程序 动态修改页面数据及参数传递过程详解
2019/09/27 Javascript
vue使用showdown并实现代码区域高亮的示例代码
2019/10/17 Javascript
小程序表单认证布局及验证详解
2020/06/19 Javascript
解决vuex刷新数据消失问题
2020/11/12 Javascript
Python ldap实现登录实例代码
2016/09/30 Python
Python使用QQ邮箱发送Email的方法实例
2017/02/09 Python
Python生成随机数组的方法小结
2017/04/15 Python
python unittest实现api自动化测试
2018/04/04 Python
python实现决策树分类(2)
2018/08/30 Python
Pytorch中accuracy和loss的计算知识点总结
2019/09/10 Python
Tensorflow Summary用法学习笔记
2020/01/10 Python
python根据完整路径获得盘名/路径名/文件名/文件扩展名的方法
2020/04/22 Python
Python pandas 列转行操作详解(类似hive中explode方法)
2020/05/18 Python
Python代码覆盖率统计工具coverage.py用法详解
2020/11/25 Python
机械设备与数控技术专业求职信
2014/08/10 职场文书
2014年民警工作总结
2014/11/25 职场文书
会议主持人开场白台词
2015/05/28 职场文书
疑《守望先锋2》A测截图泄露 或将推出新模式、新界面
2022/04/03 其他游戏
MySql重置root密码 --skip-grant-tables
2022/04/11 MySQL