介绍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多线程扫描端口示例
Jan 16 Python
Python实现基于权重的随机数2种方法
Apr 28 Python
详解Python的Flask框架中生成SECRET_KEY密钥的方法
Jun 07 Python
Python+matplotlib+numpy绘制精美的条形统计图
Jan 02 Python
pandas DataFrame数据转为list的方法
Apr 11 Python
python中将正则过滤的内容输出写入到文件中的实例
Oct 21 Python
Python在OpenCV里实现极坐标变换功能
Sep 02 Python
Python绘制二维曲线的日常应用详解
Dec 04 Python
Python Django form 组件动态从数据库取choices数据实例
May 19 Python
python中有函数重载吗
May 28 Python
Python使用tkinter实现小时钟效果
Feb 22 Python
windows安装python超详细图文教程
May 21 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
终于听上了直流胆调频
2021/03/02 无线电
php实现在线生成条形码示例分享(条形码生成器)
2013/12/30 PHP
分享微信扫码支付开发遇到问题及解决方案-附Ecshop微信支付插件
2015/08/23 PHP
PHP入门教程之数学运算技巧总结
2016/09/11 PHP
thinkPHP中钩子的使用方法实例分析
2017/11/16 PHP
PHP crypt()函数的用法讲解
2019/02/15 PHP
php 中self,this的区别和操作方法实例分析
2019/11/04 PHP
javascript 实现父窗口引用弹出窗口的值的脚本
2007/08/07 Javascript
解javascript 混淆加密收藏
2009/01/16 Javascript
jquery last-child 列表最后一项的样式
2010/01/22 Javascript
JavaScript高级程序设计 阅读笔记(十四) js继承机制的实现
2012/08/14 Javascript
jquery checkbox实现单选小例
2013/11/27 Javascript
javascript函数声明和函数表达式区别分析
2014/12/02 Javascript
JavaScript获取网页中第一个链接ID的方法
2015/04/03 Javascript
jQuery绑定事件-多种实现方式总结
2016/05/09 Javascript
jQuery扩展实现text提示还能输入多少字节的方法
2016/11/28 Javascript
jquery操作ul的一些操作笔记整理(干货)
2017/08/31 jQuery
vuejs使用递归组件实现树形目录的方法
2017/09/30 Javascript
Angular4.0中引入laydate.js日期插件的方法教程
2017/12/25 Javascript
基于node简单实现RSA加解密的方法步骤
2019/03/21 Javascript
layer弹出层显示在top顶层的方法
2019/09/11 Javascript
vue移动端弹起蒙层滑动禁止底部滑动操作
2020/07/22 Javascript
[44:40]KG vs LGD 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
[49:12]完美世界DOTA2联赛PWL S2 Magma vs GXR 第二场 11.29
2020/12/02 DOTA
Python实现的读取/更改/写入xml文件操作示例
2018/08/30 Python
在python 不同时区之间的差值与转换方法
2019/01/14 Python
美国背景检查、公共记录和人物搜索网站:BeenVerified
2018/02/25 全球购物
乡镇食品安全责任书
2014/07/28 职场文书
防灾减灾活动总结
2014/08/30 职场文书
2015年服务员工作总结
2015/04/08 职场文书
中学生勤俭节约倡议书
2015/04/29 职场文书
退货证明模板
2015/06/23 职场文书
员工担保书范本
2015/09/22 职场文书
公司年会主持词范文!
2019/05/07 职场文书
毕业季聚会祝酒词!
2019/07/04 职场文书
Java中API的使用方法详情
2022/04/06 Java/Android