介绍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抓取京东图书评论数据
Aug 31 Python
python常规方法实现数组的全排列
Mar 17 Python
python实现kMeans算法
Dec 21 Python
python学生信息管理系统(完整版)
Apr 05 Python
Python中super函数用法实例分析
Mar 18 Python
Python 继承,重写,super()调用父类方法操作示例
Sep 29 Python
150行python代码实现贪吃蛇游戏
Apr 24 Python
sklearn的predict_proba使用说明
Jun 28 Python
python中的测试框架
Nov 13 Python
python for循环赋值问题
Jun 03 Python
Pygame Event事件模块的详细示例
Nov 17 Python
Python实现学生管理系统并生成exe可执行文件详解流程
Jan 22 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
通过ODBC连接的SQL SERVER实例
2006/10/09 PHP
php 模拟POST|GET操作实现代码
2010/07/20 PHP
smarty模板引擎从php中获取数据的方法
2015/01/22 PHP
ThinkPHP文件缓存类代码分享
2015/04/22 PHP
Zend Framework实现自定义过滤器的方法
2016/12/09 PHP
php post json参数的传递和接收处理方法
2018/05/31 PHP
PHP 实现手机端APP支付宝支付功能
2018/06/07 PHP
JavaScript 判断日期格式是否正确的实现代码
2011/07/04 Javascript
网页源代码保护(禁止右键、复制、另存为、查看源文件)
2012/05/23 Javascript
Nodejs学习笔记之测试驱动
2015/04/16 NodeJs
javascript实现tab切换的两个实例
2015/11/05 Javascript
一起学写js Calender日历控件
2016/04/14 Javascript
Mongoose实现虚拟字段查询的方法详解
2017/08/15 Javascript
浅谈express 中间件机制及实现原理
2017/08/31 Javascript
js定时器+简单的动画效果实例
2017/11/10 Javascript
vue 动态改变静态图片以及请求网络图片的实现方法
2018/02/07 Javascript
基于vue.js中关于下拉框的值默认及绑定问题
2018/08/22 Javascript
vue基于element的区间选择组件
2018/09/07 Javascript
Vue实现本地购物车功能
2018/12/05 Javascript
js中对象与对象创建方法的各种方法
2019/02/27 Javascript
layui实现数据分页功能(ajax异步)
2019/07/27 Javascript
对layui数据表格动态cols(字段)动态变化详解
2019/10/25 Javascript
利用python实现数据分析
2017/01/11 Python
使用apidoc管理RESTful风格Flask项目接口文档方法
2018/02/07 Python
解决项目pycharm能运行,在终端却无法运行的问题
2019/01/19 Python
Python 基于FIR实现Hilbert滤波器求信号包络详解
2020/02/26 Python
Python3实现英文字母转换哥特式字体实例代码
2020/09/01 Python
HTML5之SVG 2D入门13—svg对决canvas及长处和适用场景分析
2013/01/30 HTML / CSS
GWT (Google Web Toolkit)有哪些主要的原件组成?
2015/06/08 面试题
你的创业计划书怎样才能打动风投
2014/02/06 职场文书
大专生自我鉴定怎么写
2014/09/16 职场文书
公安领导班子四风问题个人整改措施思想汇报
2014/10/09 职场文书
2015军训通讯稿大全
2015/07/18 职场文书
送给自己的励志语句:要安静的优秀,悄无声息的坚强
2019/11/26 职场文书
Python机器学习之KNN近邻算法
2021/05/14 Python
Java代码规范与质量检测插件SonarLint的使用
2022/08/05 Java/Android