介绍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 的 with 语句详解
Jun 13 Python
python结合shell查询google关键词排名的实现代码
Feb 27 Python
Python3控制路由器——使用requests重启极路由.py
May 11 Python
在Python程序和Flask框架中使用SQLAlchemy的教程
Jun 06 Python
python实现矩阵打印
Mar 02 Python
10分钟用python搭建一个超好用的CMDB系统
Jul 17 Python
python 哈希表实现简单python字典代码实例
Sep 27 Python
python scatter函数用法实例详解
Feb 11 Python
python实现坦克大战
Apr 24 Python
零基础小白多久能学会python
Jun 22 Python
Pythonic版二分查找实现过程原理解析
Aug 11 Python
Python编写可视化界面的全过程(Python+PyCharm+PyQt)
May 17 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解析器类可用于采集数据
2013/09/23 PHP
利用PHP fsockopen 模拟POST/GET传送数据的方法
2015/09/22 PHP
PHP严重致命错误处理:php Fatal error: Cannot redeclare class or function
2017/02/05 PHP
PHP合并数组函数array_merge用法分析
2017/02/17 PHP
PHP实现数组转JSon和JSon转数组的方法示例
2018/06/14 PHP
thinkPHP5使用Rabc实现权限管理
2019/08/28 PHP
php 使用 __call实现重载功能示例
2019/11/18 PHP
alixixi runcode.asp的代码不错的应用
2007/08/08 Javascript
jQuery入门第一课 jQuery选择符
2010/03/14 Javascript
基于jquery的跟随屏幕滚动代码
2012/07/24 Javascript
Jquery实现搜索框提示功能示例代码
2013/08/13 Javascript
Jquery对数组的操作技巧整理
2014/03/25 Javascript
JavaScript如何自定义trim方法
2015/07/28 Javascript
js实现有过渡渐变效果的图片轮播相册(兼容IE,ff)
2016/01/19 Javascript
Bootstrap开关(switch)控件学习笔记分享
2016/05/30 Javascript
AngularJS基础 ng-switch 指令简单示例
2016/08/03 Javascript
jQuery实现单击按钮遮罩弹出对话框效果(2)
2017/02/20 Javascript
JavaScript基于扩展String实现替换字符串中index处字符的方法
2017/06/13 Javascript
JS实现发送短信验证后按钮倒计时功能(防止刷新倒计时失效)
2017/07/07 Javascript
JS实现DOM删除节点操作示例
2018/04/04 Javascript
浅析Vue 生命周期
2018/06/21 Javascript
Angular2中监听数据更新的方法
2018/08/31 Javascript
深入解析ES6中的promise
2018/11/08 Javascript
微信小程序 网络通信实现详解
2019/07/23 Javascript
javascript如何实现create方法
2019/11/04 Javascript
JavaScript实现简单的计算器
2020/01/16 Javascript
解决Ubuntu pip 安装 mysql-python包出错的问题
2018/06/11 Python
Python3使用xml.dom.minidom和xml.etree模块儿解析xml文件封装函数的方法
2019/09/23 Python
Python爬虫之Selenium鼠标事件的实现
2020/12/04 Python
html5 viewport使用方法示例详解
2013/12/02 HTML / CSS
香港个人化生活购物网站:Ballyhoo Limited
2016/09/10 全球购物
Koral官方网站:女性时尚运动服
2019/04/10 全球购物
Expedia瑞典官网:预订度假屋、酒店、汽车租赁、机票等
2021/01/23 全球购物
大学生表扬信范文
2014/01/09 职场文书
黄石寨导游词
2015/02/05 职场文书
MySQL的索引你了解吗
2022/03/13 MySQL