介绍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动态加载模块的3种方法
Nov 22 Python
PyQt5 pyqt多线程操作入门
May 05 Python
Python lambda表达式用法实例分析
Dec 25 Python
解决python文件双击运行秒退的问题
Jun 24 Python
Python实现非正太分布的异常值检测方式
Dec 09 Python
Python restful框架接口开发实现
Apr 13 Python
Python 中由 yield 实现异步操作
May 04 Python
Django微信小程序后台开发教程的实现
Jun 03 Python
Django Session和Cookie分别实现记住用户登录状态操作
Jul 02 Python
详解python对象之间的交互
Sep 29 Python
python树莓派通过队列实现进程交互的程序分析
Jul 04 Python
Python os和os.path模块详情
Apr 02 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函数
2006/10/09 PHP
PHP函数篇之掌握ord()与chr()函数应用
2011/12/05 PHP
如何阻止网站被恶意反向代理访问(防网站镜像)
2014/03/18 PHP
PHP调用存储过程返回值不一致问题的解决方法分析
2016/04/26 PHP
浅析PHP中的i++与++i的区别及效率
2016/06/15 PHP
php格式化时间戳
2016/12/17 PHP
浅谈PHP中的面向对象OOP中的魔术方法
2017/06/12 PHP
Ext面向对象开发实践(续)
2008/11/18 Javascript
jquery1.9 下检测浏览器类型和版本的方法
2013/12/26 Javascript
JS仿Windows开机启动Loading进度条的方法
2015/02/26 Javascript
JavaScript实现数字数组按照倒序排列的方法
2015/04/06 Javascript
使用jQuery制作基础的Web图片轮播效果
2016/04/22 Javascript
JS实现探测网站链接的方法【测试可用】
2016/11/08 Javascript
JavaScript轮播停留效果的实现思路
2018/05/24 Javascript
angularJS开发注意事项
2018/05/26 Javascript
javascript和php使用ajax通信传递JSON的实例
2018/08/21 Javascript
详解nodejs 配置文件处理方案
2019/01/02 NodeJs
vue实现百度下拉列表交互操作示例
2019/03/12 Javascript
详解python进行mp3格式判断
2016/12/23 Python
Python实现的快速排序算法详解
2017/08/01 Python
python模糊图片过滤的方法
2018/12/14 Python
对python 中re.sub,replace(),strip()的区别详解
2019/07/22 Python
python设计tcp数据包协议类的例子
2019/07/23 Python
PyTorch中permute的用法详解
2019/12/30 Python
对tensorflow中的strides参数使用详解
2020/01/04 Python
详解Python3 中的字符串格式化语法
2020/01/15 Python
找Python安装目录,设置环境路径以及在命令行运行python脚本实例
2020/03/09 Python
python中判断文件结束符的具体方法
2020/08/04 Python
html5视频自动横过来自适应页面且点击播放功能的实现
2020/06/03 HTML / CSS
菲律宾购物网站:Lazada菲律宾
2018/04/05 全球购物
优秀民警事迹材料
2014/01/29 职场文书
企业法人授权委托书范本
2014/09/23 职场文书
群众路线四风问题整改措施
2014/09/27 职场文书
2014年世界艾滋病日宣传活动总结
2014/11/18 职场文书
工作态度检讨书范文
2015/05/06 职场文书
2016年幼儿园教研活动总结
2016/04/05 职场文书