介绍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中Django 后台自定义表单控件
Mar 28 Python
在django中使用自定义标签实现分页功能
Jul 04 Python
详解Python 实现元胞自动机中的生命游戏(Game of life)
Jan 27 Python
PyQt5每天必学之日历控件QCalendarWidget
Apr 19 Python
TensorFlow实现卷积神经网络
May 24 Python
python实现一个简单的ping工具方法
Jan 31 Python
Python基本数据结构与用法详解【列表、元组、集合、字典】
Mar 23 Python
在python中,使用scatter绘制散点图的实例
Jul 03 Python
利用python在excel中画图的实现方法
Mar 17 Python
sklearn线性逻辑回归和非线性逻辑回归的实现
Jun 09 Python
详细分析Python可变对象和不可变对象
Jul 09 Python
Python趣味实例,实现一个简单的抽奖刮刮卡
Jul 18 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
图解上海144收音机
2021/03/02 无线电
ASP和PHP实现生成网站快捷方式并下载到桌面的方法
2014/05/08 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
jQuery获取浏览器中的分辨率实现代码
2013/04/23 Javascript
浅析jquery某一元素重复绑定的问题
2014/01/03 Javascript
jQuery插件分享之分页插件jqPagination
2014/06/06 Javascript
简易的投票系统以及js刷票思路和方法
2015/04/07 Javascript
jQuery的css() 方法使用指南
2015/05/03 Javascript
JS实现仿新浪黄色经典滑动门效果代码
2015/09/27 Javascript
JavaScript禁止复制与粘贴的实现代码
2016/05/16 Javascript
浅谈JavaScript的自动垃圾收集机制
2016/12/15 Javascript
提高Web性能的前端优化技巧总结
2017/02/27 Javascript
基于vue中keep-alive缓存问题的解决方法
2018/09/21 Javascript
详解VUE前端按钮权限控制
2019/04/26 Javascript
原生js实现随机点名功能
2019/11/05 Javascript
解决antd 表单设置默认值initialValue后验证失效的问题
2020/11/02 Javascript
Python入门篇之字典
2014/10/17 Python
python Django批量导入不重复数据
2016/03/25 Python
为Python的Tornado框架配置使用Jinja2模板引擎的方法
2016/06/30 Python
python的多重继承的理解
2017/08/06 Python
Python实现定时执行任务的三种方式简单示例
2019/03/30 Python
Python时间序列处理之ARIMA模型的使用讲解
2019/04/02 Python
python实现各种插值法(数值分析)
2019/07/30 Python
解决Tensorboard 不显示计算图graph的问题
2020/02/15 Python
Python virtualenv虚拟环境实现过程解析
2020/04/18 Python
使用django自带的user做外键的方法
2020/11/30 Python
Html5让容器充满屏幕高度或自适应剩余高度的布局实现
2020/05/14 HTML / CSS
如何在存储过程中使用Loop
2016/01/05 面试题
汽车检测与维修专业求职信
2013/10/30 职场文书
总账会计岗位职责
2014/03/13 职场文书
竞选劳动委员演讲稿
2014/04/28 职场文书
消防工作实施方案
2014/06/09 职场文书
我为党旗添光彩演讲稿
2014/09/10 职场文书
给老师的感谢信
2015/01/20 职场文书
2016年社区六一儿童节活动总结
2016/04/06 职场文书
ConstraintValidator类如何实现自定义注解校验前端传参
2021/06/18 Java/Android