介绍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实现在pickling的时候压缩的方法
Sep 25 Python
深入理解Python3中的http.client模块
Mar 29 Python
解决python3 urllib 链接中有中文的问题
Jul 16 Python
Python爬取个人微信朋友信息操作示例
Aug 03 Python
Python面向对象程序设计示例小结
Jan 30 Python
python实现nao机器人身体躯干和腿部动作操作
Apr 29 Python
使用python脚本自动创建pip.ini配置文件代码实例
Sep 20 Python
Python Selenium参数配置方法解析
Jan 19 Python
Python基础之列表常见操作经典实例详解
Feb 26 Python
keras训练浅层卷积网络并保存和加载模型实例
Jul 02 Python
python UIAutomator2使用超详细教程
Feb 19 Python
python爬取豆瓣电影TOP250数据
May 23 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中strtotime函数使用方法详解
2011/11/27 PHP
php过滤所有恶意字符(批量过滤post,get敏感数据)
2014/03/18 PHP
Yii框架关联查询with用法分析
2014/12/02 PHP
TP3.2.3框架文件上传操作实例详解
2020/01/23 PHP
ExtJS 2.0实用简明教程之应用ExtJS
2009/04/29 Javascript
js判断客户端是iOS还是Android等移动终端的方法
2013/12/11 Javascript
利用JS解决ie6不支持max-width,max-height问题的方法
2014/01/02 Javascript
百度判断手机终端并自动跳转js代码及使用实例
2014/06/11 Javascript
纯JavaScript实现获取onclick、onchange等事件的值
2014/12/29 Javascript
javascript实现点击按钮让DIV层弹性移动的方法
2015/02/24 Javascript
Bootstrap与Angularjs的模态框实例代码
2017/08/03 Javascript
微信小程序实现图片懒加载的示例代码
2017/12/13 Javascript
基于vue.js实现的分页
2018/03/13 Javascript
微信小程序实现长按删除图片的示例
2018/05/18 Javascript
JavaScript监听一个DOM元素大小变化
2020/04/26 Javascript
[33:28]完美世界DOTA2联赛PWL S3 PXG vs GXR 第三场 12.19
2020/12/24 DOTA
Python读取mp3中ID3信息的方法
2015/03/05 Python
在Python的Django框架中显示对象子集的方法
2015/07/21 Python
Python进行数据提取的方法总结
2016/08/22 Python
python实现字典(dict)和字符串(string)的相互转换方法
2017/03/01 Python
Python 获取指定文件夹下的目录和文件的实现
2019/08/30 Python
python使用正则来处理各种匹配问题
2019/12/22 Python
Pytorch 多块GPU的使用详解
2019/12/31 Python
python爬虫分布式获取数据的实例方法
2020/11/26 Python
CSS3 clip-path 用法介绍详解
2018/03/01 HTML / CSS
HTML中meta标签及Keywords
2020/04/15 HTML / CSS
触发器(trigger)的功能都有哪些?写出一个触发器的例子
2012/09/17 面试题
优纳科技软件测试面试题
2012/05/15 面试题
詹天佑教学反思
2014/04/30 职场文书
先进工作者推荐材料
2014/12/23 职场文书
2015年行风建设工作总结
2015/05/15 职场文书
初中班长竞选稿
2015/11/20 职场文书
传单、海报早OUT了,另类传单营销方案送给你!
2019/07/15 职场文书
从np.random.normal()到正态分布的拟合操作
2021/06/02 Python
MySQL之select、distinct、limit的使用
2021/11/11 MySQL
开发者首先否认《遗弃》被取消的传言
2022/04/11 其他游戏