介绍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 相关文章推荐
数据挖掘之Apriori算法详解和Python实现代码分享
Nov 07 Python
Python中用Spark模块的使用教程
Apr 13 Python
python 打印直角三角形,等边三角形,菱形,正方形的代码
Nov 21 Python
python 文件转成16进制数组的实例
Jul 09 Python
10 行 Python 代码教你自动发送短信(不想回复工作邮件妙招)
Oct 11 Python
在python中只选取列表中某一纵列的方法
Nov 28 Python
Django 用户认证组件使用详解
Jul 23 Python
python opencv图片编码为h264文件的实例
Dec 12 Python
简单了解Python读取大文件代码实例
Dec 18 Python
pyftplib中文乱码问题解决方案
Jan 11 Python
Django之form组件自动校验数据实现
Jan 14 Python
Python开发企业微信机器人每天定时发消息实例
Mar 17 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
ThinkPHP惯例配置文件详解
2014/07/14 PHP
PHP精确计算功能示例
2016/11/29 PHP
PHP自动补全表单的两种方法
2017/03/06 PHP
PHP实现下载远程图片保存到本地的方法
2017/06/19 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
2020/02/27 PHP
Javascript中的数学函数集合
2007/05/08 Javascript
jQuery .tmpl(), .template()学习资料小结
2011/07/18 Javascript
JS判断元素为数字的奇异写法分享
2012/08/01 Javascript
JS简单实现文件上传实例代码(无需插件)
2013/11/15 Javascript
JavaScript Window浏览器对象模型方法与属性汇总
2015/04/20 Javascript
JavaScript获取两个数组交集的方法
2015/06/09 Javascript
浅谈javascript中的call、apply、bind
2016/03/06 Javascript
JavaScript中对JSON对象的基本操作示例
2016/05/21 Javascript
基于HTML+CSS+JS实现增加删除修改tab导航特效代码
2016/08/05 Javascript
关于javascript中限定时间内防止按钮重复点击的思路详解
2016/08/16 Javascript
AngularJS全局scope与Isolate scope通信用法示例
2016/11/22 Javascript
jQuery实用密码强度检测
2017/03/02 Javascript
浅谈angularjs中响应回车事件
2017/04/24 Javascript
node vue项目开发之前后端分离实战记录
2017/12/13 Javascript
深入理解JavaScript和TypeScript中的class
2018/04/22 Javascript
React Native基础入门之初步使用Flexbox布局
2018/07/02 Javascript
NodeJS 将文件夹按照存放路径变成一个对应的JSON的方法
2018/10/17 NodeJs
layui时间控件选择时间范围的实现方法
2019/09/28 Javascript
[54:47]Liquid vs VP Supermajor决赛 BO 第五场 6.10
2018/07/05 DOTA
详解Python之数据序列化(json、pickle、shelve)
2017/03/30 Python
使用Python脚本zabbix自定义key监控oracle连接状态
2019/08/28 Python
Django 实现外键去除自动添加的后缀‘_id’
2019/11/15 Python
python函数定义和调用过程详解
2020/02/09 Python
Django实现后台上传并显示图片功能
2020/05/29 Python
python 写一个性能测试工具(一)
2020/10/24 Python
贝尔帐篷精品店:Bell Tent Boutique
2019/06/12 全球购物
历史专业大学生职业生涯规划书
2014/03/13 职场文书
关于清明节的演讲稿
2014/09/13 职场文书
高中学生自我评价范文
2014/09/23 职场文书
巧用 -webkit-box-reflect 倒影实现各类动效(小结)
2021/04/22 HTML / CSS
JavaScript数组 几个常用方法总结
2021/11/11 Javascript