介绍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生成url短链接的方法
May 04 Python
python处理xml文件的方法小结
May 02 Python
Python 装饰器使用详解
Jul 29 Python
Python异常对代码运行性能的影响实例解析
Feb 08 Python
python 日期操作类代码
May 05 Python
python cs架构实现简单文件传输
Mar 20 Python
Opencv-Python图像透视变换cv2.warpPerspective的示例
Apr 11 Python
pandas计算最大连续间隔的方法
Jul 04 Python
Python处理session的方法整理
Aug 29 Python
flask框架渲染Jinja模板与传入模板变量操作详解
Jan 25 Python
Python发送邮件封装实现过程详解
May 09 Python
Python编写单元测试代码实例
Sep 10 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
ADODB的数据库封包程序库
2006/12/31 PHP
Codeigniter中禁止A Database Error Occurred错误提示的方法
2014/06/12 PHP
php将文本文件转换csv输出的方法
2014/12/31 PHP
php实现四舍五入的方法小结
2015/03/03 PHP
通用于ie和firefox的函数 GetCurrentStyle (obj, prop)
2006/12/27 Javascript
js 变量类型转换常用函数与代码[比较全]
2009/12/01 Javascript
javascript dom 基本操作小结
2010/04/11 Javascript
jQuery中$.each使用详解
2015/01/29 Javascript
jQuery简单实现遍历数组的方法
2015/04/14 Javascript
javascript事件冒泡和事件捕获详解
2015/05/26 Javascript
Jquery日期选择datepicker插件用法实例分析
2015/06/08 Javascript
js模仿php中strtotime()与date()函数实现方法
2015/08/11 Javascript
JavaScript希尔排序、快速排序、归并排序算法
2016/05/08 Javascript
js封装tab标签页实例分享
2016/12/19 Javascript
Vue2.0使用过程常见的一些问题总结学习
2017/04/10 Javascript
完美实现js拖拽效果 return false用法详解
2017/07/28 Javascript
微信小程序实现下载进度条的方法
2017/12/08 Javascript
JS实现的简单拖拽购物车功能示例【附源码下载】
2018/01/03 Javascript
js实现AI五子棋人机大战
2020/05/28 Javascript
vue项目配置同一局域网可使用ip访问的操作
2020/10/23 Javascript
python3抓取中文网页的方法
2015/07/28 Python
Python中应该使用%还是format来格式化字符串
2018/09/25 Python
python退出命令是什么?详解python退出方法
2018/12/10 Python
Python socket模块实现的udp通信功能示例
2019/04/10 Python
python 常见的排序算法实现汇总
2020/08/21 Python
澳大利亚首个在线预订旅游网站:Wotif
2017/07/19 全球购物
东芝官网商城:还原日式美学,打造美好生活
2018/12/27 全球购物
计算机专业个人求职自荐信
2013/09/21 职场文书
会计专业推荐信
2013/10/29 职场文书
退伍老兵事迹材料
2014/01/31 职场文书
火锅店营销方案
2014/02/26 职场文书
工程力学专业自荐信范文
2014/03/17 职场文书
爱祖国爱家乡演讲稿
2014/09/02 职场文书
弘扬焦裕禄精神走群众路线思想汇报
2014/09/12 职场文书
计划生育工作总结2015
2015/04/03 职场文书
详解Python函数print用法
2021/06/18 Python