介绍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获取CPU、内存和硬盘等windowns系统信息的2个例子
Apr 15 Python
将Django框架和遗留的Web应用集成的方法
Jul 24 Python
python函数中return后的语句一定不会执行吗?
Jul 06 Python
在Python中实现替换字符串中的子串的示例
Oct 31 Python
解决pycharm运行出错,代码正确结果不显示的问题
Nov 30 Python
Python面向对象程序设计OOP入门教程【类,实例,继承,重载等】
Jan 05 Python
使用python socket分发大文件的实现方法
Jul 08 Python
学习和使用python的13个理由
Jul 30 Python
TensorBoard 计算图的查看方式
Feb 15 Python
Python Excel vlookup函数实现过程解析
Jun 22 Python
Python编写万花尺图案实例
Jan 03 Python
Python标准库pathlib操作目录和文件
Nov 20 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.ini中date.timezone设置分析
2011/07/29 PHP
javascript之学会吝啬 精简代码
2010/04/25 Javascript
JQuery+JS实现仿百度搜索结果中关键字变色效果
2011/08/02 Javascript
关于Jquery操作Cookie取值错误的解决方法
2013/08/26 Javascript
JavaScript实现更改网页背景与字体颜色的方法
2015/02/02 Javascript
javascript随机显示背景图片的方法
2015/06/18 Javascript
全面了解JavaScript的数据类型转换
2016/07/01 Javascript
AngularJs Understanding the Model Component
2016/09/02 Javascript
KnockoutJS 3.X API 第四章之数据控制流foreach绑定
2016/10/10 Javascript
JS实现的简易拖放效果示例
2016/12/29 Javascript
JavaScript遍历数组的三种方法map、forEach与filter实例详解
2019/02/27 Javascript
重学JS之显示强制类型转换详解
2019/06/30 Javascript
angularjs自定义过滤器demo示例
2019/08/24 Javascript
layui自定义验证,用ajax查询后台是否有重复数据,form.verify的例子
2019/09/06 Javascript
详解Vue的mixin策略
2020/11/19 Vue.js
在Python中定义和使用抽象类的方法
2016/06/30 Python
利用ctypes提高Python的执行速度
2016/09/09 Python
基于并发服务器几种实现方法(总结)
2017/12/29 Python
Python回文字符串及回文数字判定功能示例
2018/03/20 Python
Python批处理删除和重命名文件夹的实例
2018/07/11 Python
对python中dict和json的区别详解
2018/12/18 Python
解决yum对python依赖版本问题
2019/07/05 Python
Python爬虫使用浏览器cookies:browsercookie过程解析
2019/10/22 Python
使用python求解二次规划的问题
2020/02/29 Python
h5页面唤起app如果没安装就跳转下载(iOS和Android)
2020/06/03 HTML / CSS
Boden美国官网:英伦原创时装品牌
2017/07/03 全球购物
意大利制造的男鞋和女鞋:SCAROSSO
2018/03/07 全球购物
JDK安装目录下有哪些内容
2014/08/25 面试题
造型师求职自荐信
2013/09/27 职场文书
主管竞聘书范文
2014/03/31 职场文书
优秀应届本科生求职信
2014/07/19 职场文书
学雷锋活动倡议书
2014/08/30 职场文书
2015年七年级班主任工作总结
2015/05/21 职场文书
昆虫记读书笔记
2015/06/26 职场文书
pytorch MSELoss计算平均的实现方法
2021/05/12 Python
Python 实现定积分与二重定积分的操作
2021/05/26 Python