介绍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 相关文章推荐
简单介绍利用TK在Python下进行GUI编程的教程
Apr 13 Python
pygame学习笔记(4):声音控制
Apr 15 Python
Python脚本实现12306火车票查询系统
Sep 30 Python
Python编程判断一个正整数是否为素数的方法
Apr 14 Python
Python操作Redis之设置key的过期时间实例代码
Jan 25 Python
[原创]Python入门教程3. 列表基本操作【定义、运算、常用函数】
Oct 30 Python
Python列表(list)所有元素的同一操作解析
Aug 01 Python
django之自定义软删除Model的方法
Aug 14 Python
python elasticsearch环境搭建详解
Sep 02 Python
python自动识别文本编码格式代码
Dec 26 Python
python利用JMeter测试Tornado的多线程
Jan 12 Python
Python QTimer实现多线程及QSS应用过程解析
Jul 11 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 去除html标记--strip_tags与htmlspecialchars的区别详解
2013/06/26 PHP
5款适合PHP使用的HTML编辑器推荐
2015/07/03 PHP
PHP的mysqli_select_db()函数讲解
2019/01/23 PHP
jQuery 使用手册(七)
2009/09/23 Javascript
Javascript学习笔记之 对象篇(三) : hasOwnProperty
2014/06/24 Javascript
用Jquery选择器计算table中的某一列某一行的合计
2014/08/13 Javascript
从数据库读取数据后将其输出成html标签的三种方法
2014/10/13 Javascript
jQuery绑定自定义事件的魔法升级版
2016/06/30 Javascript
学好js,这些js函数概念一定要知道【推荐】
2017/01/19 Javascript
node.JS md5加密中文与php结果不一致的解决方法
2017/05/05 Javascript
angular过滤器实现排序功能
2017/06/27 Javascript
JavaScript阻止表单提交方法(附代码)
2017/08/15 Javascript
Redux实现组合计数器的示例代码
2018/07/04 Javascript
微信小程序使用template标签实现五星评分功能
2018/11/03 Javascript
Electron-vue开发的客户端支付收款工具的实现
2019/05/24 Javascript
js实现滑动进度条效果
2020/08/21 Javascript
JavaScript 几种循环方式以及模块化的总结
2020/09/03 Javascript
详解详解Python中writelines()方法的使用
2015/05/25 Python
python3.4用函数操作mysql5.7数据库
2017/06/23 Python
Python基础学习之常见的内建函数整理
2017/09/06 Python
python模块之time模块(实例讲解)
2017/09/13 Python
python决策树之CART分类回归树详解
2017/12/20 Python
浅谈Python Opencv中gamma变换的使用详解
2018/04/02 Python
Python基于TCP实现会聊天的小机器人功能示例
2018/04/09 Python
H5 video poster属性设置视频封面的方法
2020/05/25 HTML / CSS
Marriott国际:万豪国际酒店查询预订
2017/09/25 全球购物
生产管理的三大手法
2013/11/11 职场文书
最受欢迎的自我评价
2013/12/22 职场文书
八年级音乐教学反思
2014/01/09 职场文书
美丽乡村建设实施方案
2014/03/23 职场文书
小学生关于梦想的演讲稿
2014/08/22 职场文书
公司介绍信范文
2015/01/31 职场文书
努力学习保证书
2015/02/26 职场文书
浪漫的婚礼主持词
2015/06/30 职场文书
Mysql排查分析慢sql之explain实战案例
2022/04/19 MySQL
python中pycryto实现数据加密
2022/04/29 Python