介绍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的Flask开发框架简单上手笔记
Nov 16 Python
python使用电子邮件模块smtplib的方法
Aug 28 Python
django.db.utils.ProgrammingError: (1146, u“Table‘’ doesn’t exist”)问题的解决
Jul 13 Python
详解Python3注释知识点
Feb 19 Python
pandas数据筛选和csv操作的实现方法
Jul 02 Python
python读写csv文件实例代码
Jul 05 Python
python 叠加等边三角形的绘制的实现
Aug 14 Python
python返回数组的索引实例
Nov 28 Python
Python处理mysql特殊字符的问题
Mar 02 Python
Python3监控windows,linux系统的CPU、硬盘、内存使用率和各个端口的开启情况详细代码实例
Mar 18 Python
基于PyInstaller各参数的含义说明
Mar 04 Python
实例讲解Python中sys.argv[]的用法
Jun 03 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
Notice: Undefined index: page in E:\PHP\test.php on line 14
2010/11/02 PHP
Yii使用Captcha验证码的方法
2015/12/28 PHP
php中关于长度计算容易混淆的问题分析
2016/05/27 PHP
详解提高使用Java反射的效率方法
2019/04/29 PHP
PHP MVC框架中类的自动加载机制实例分析
2019/09/18 PHP
Javascript 文件夹选择框的两种解决方案
2009/07/01 Javascript
Javascript结合css实现网页换肤功能
2009/11/02 Javascript
基于jquery实现的省市区级联无ajax
2013/09/24 Javascript
JsRender实用入门教程
2014/10/31 Javascript
jQuery实现的文字hover颜色渐变效果实例
2016/02/20 Javascript
jquery ui sortable拖拽后保存位置
2017/04/27 jQuery
微信小程序 支付后台java实现实例
2017/05/09 Javascript
javaScript和jQuery自动加载简单代码实现方法
2017/11/24 jQuery
说说Vuex的getters属性的具体用法
2019/04/15 Javascript
Vue数据双向绑定底层实现原理
2019/11/22 Javascript
[56:46]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 VP vs Effect
2018/04/01 DOTA
从零学Python之hello world
2014/05/21 Python
Python PyQt5实现的简易计算器功能示例
2017/08/23 Python
Python判断两个对象相等的原理
2017/12/12 Python
Python实现获取邮箱内容并解析的方法示例
2018/06/16 Python
Windows 8.1 64bit下搭建 Scrapy 0.22 环境
2018/11/18 Python
python实现维吉尼亚算法
2019/03/20 Python
Python切图九宫格的实现方法
2019/10/10 Python
pyspark 随机森林的实现
2020/04/24 Python
python库skimage给灰度图像染色的方法示例
2020/04/27 Python
详细分析Python可变对象和不可变对象
2020/07/09 Python
HTML5 Canvas旋转动画的2个代码例子(一个旋转的太极图效果)
2014/04/10 HTML / CSS
Html5监听手机摇一摇事件的实现
2019/11/07 HTML / CSS
中邮全球便购:中国邮政速递物流
2017/03/04 全球购物
Vans(范斯)德国官网:美国南加州的原创极限运动潮牌
2017/05/02 全球购物
利物浦足球俱乐部官方商店(美国):Liverpool FC US
2019/10/09 全球购物
自我推荐书
2013/12/04 职场文书
财务简历的自我评价
2014/03/05 职场文书
医院志愿者活动总结
2015/05/06 职场文书
2016年国庆节宣传标语
2015/11/25 职场文书
MySQL之PXC集群搭建的方法步骤
2021/05/25 MySQL