Python2与Python3兼容

python3写的代码如何也能在pyhon2上跑?请无论如何加上这一句,python3没有啥影响

from __future__ import absolute_import, unicode_literals, division, print_function

__future__模块提供某些将要引入的特性,python 2.7.5的__future__基本上是python3中的特性

开始

使用我们的jupyter交互式工具进行探讨,以下皆为python2

有以下内容

In [1]: import __future__

In [2]: __future__.

__future__.CO_FUTURE_ABSOLUTE_IMPORT __future__.all_feature_names

__future__.CO_FUTURE_DIVISION __future__.division

__future__.CO_FUTURE_PRINT_FUNCTION __future__.generators

__future__.CO_FUTURE_UNICODE_LITERALS __future__.nested_scopes

__future__.CO_FUTURE_WITH_STATEMENT __future__.print_function

__future__.CO_GENERATOR_ALLOWED __future__.unicode_literals

__future__.CO_NESTED __future__.with_statement

__future__.absolute_import

In [2]: __future__.

可导入的功能有哪些?

In [3]: import __future__

In [4]: __future__.all_feature_names

Out[4]:

['nested_scopes',

'generators',

'division',

'absolute_import',

'with_statement',

'print_function',

'unicode_literals']

对应功能如下

division

division 新的除法特性,本来的除号/对于分子分母是整数的情况会取整,但新特性中在此情况下的除法不会取整,取整的使用//。如下可见,只有分子分母都是整数时结果不同。

In [1]: 3 / 5

Out[1]: 0

In [2]: 3 // 5

Out[2]: 0

In [3]: 3.0 / 5.0

Out[3]: 0.6

In [4]: 3.0 // 5.0

Out[4]: 0.0

In [5]: from __future__ import division

In [6]: 3 / 5

Out[6]: 0.6

In [7]: 3 // 5

Out[7]: 0

In [8]: 3.0 / 5.0

Out[8]: 0.6

In [9]: 3.0 // 5.0

Out[9]: 0.0

print_function

print_function 新的print是一个函数,如果导入此特性,之前的print语句就不能用了。

In [1]: print 'test __future__'

test __future__

In [2]: from __future__ import print_function

In [3]: print('test')

test

In [4]: print 'test'

File "", line 1

print 'test'

^

SyntaxError: invalid syntax

unicode_literals

unicode_literals 这个是对字符串使用unicode字符

In [1]: print '目录'

鐩綍

In [2]: from __future__ import unicode_literals

In [3]: print '目录'

目录

在python 2.x中, 对于汉字字符串, 默认还不是采用unicode编码的, 除非在字符串前加上前缀u. 比如:

x='中国'

x

'\xd6\xd0\xb9\xfa' 这不是unicode编码

print(x)

中国

x=u'中国'

u'\u4e2d\u56fd'

print(x)

中国

在python3中默认的编码采用了unicode, 并取消了前缀u. 如果代码要兼容python2/3, 就很麻烦了. 下面的两个选择都不方便:

字符串前面不加u. 这种处理方式多数情况下没有问题, 比如print输出, 但因为汉字在py2和py3的编码方式不一样, 如果进行编码转换就麻烦了.

加python版本判断, if sys.version < ‘3‘, 字符串不加前缀u, 如果是py2, 加上前缀u. 这样代码显得很拖沓.

现在有第3种, 比较好的方法是引入unicode_literals, from __future__ import unicode_literals , 这样在py2下, ‘中国‘这样的字符串不用家前缀u, 也是unicode编码.

absolute_import

字面理解好像是仅仅允许绝对引用, 其实不然, 真实意思是禁用隐式相对引用:implicit relative import, 但并不会禁掉显式相对引用:explicit relative import.

举个例子, 目录结构如下,

-cake

|- __init__.py

|- icing.py

|- sponge.py

-drink

|- __init__.py

|- water.py

在 sponge.py 引用 icing , 有多种方法:

import icing隐式相对引用, py2已强烈不推荐使用, py3已经不可用了

from . import icing显式相对引用, python.org 官方虽不推荐, 但这却是事实标准

from cake import icing绝对引用 , python 官方推荐.

使用 __future__ absolute_import之后, 常遇到的一个问题

PackageA

|- module1.py

|- module2.py

|- __init__.py

在module1.py中,

from __future__ import absolute_impact

from . import module2 #引入同包下的另一个module

if __name__=="__main__":

print("module2 was imported in module1.")

运行会报错, ValueError: Attempted relative import in non-package.

原因分析: from . import module2 这样的写法是显式相对引用, 这种引用方式只能用于package中, 而不能用于主模块中.

因为主module的name总是为main, 并没有层次结构, 也就无从谈起相对引用了.

换句话, if __name__=="__main__": 和相对引用是不能并存的.

解决方法:

在module1中使用绝对引用, 这个最简单了, 但相对引用的好处也没了.

使用python -m来启动你的module1.py, 这个也不推荐.

(推荐,我觉得还是和第一个差不多,只不过测试换在了另外的地方)在module1中, 加个main()函数, 然后再新建一个PackageA/entry.py做为主程序, 在entry.py中使用绝对引用来引用module1, 并调用module1.main(), 这一办法虽不完美, 但我觉得是最好的方法了.

nested_scopes

这个是修改嵌套函数或lambda函数中变量的搜索顺序,从当前函数命名空间->模块命名空间的顺序更改为了当前函数命名空间->父函数命名空间->模块命名空间,python2.7.5中默认使用

generators

生成器,对应yield的语法,python2.7.5中默认使用

with_statement

使用with关键字,python2.7.5是默认使用

运用

首先是可以做个性化的用法,比如你喜欢用print()而不是print

更重要的是基本用以下几句就可以让python2和python3有良好的兼容性了

from __future__ import print_function

from __future__ import unicode_literals

from __future__ import division

from __future__ import absolute_import

map python2 python3 兼容,Python2与Python3兼容相关推荐

  1. map python2 python3 兼容_windows下 兼容Python2和Python3的解决方法

    windows下同时安装了python2和python3时,都可以配置环境变量,如果在命令行里输入python命令,windows会去环境变量里寻找Python的安装位置,如果先找到pytoon2的, ...

  2. 同时兼容Python2和Python3的字符串判断语句

    文章信息 作者:史晨 Charles Shih 创建时间:2018年08月24日 问题描述 我之前写过一个测试脚本,解释器用的是Python2.7,在RHEL7上用起来是没有问题的.但是最近要在RHE ...

  3. 在ROS中兼容Python3和Python2

    1. 安装相应的Package 需要安装catkin-tools和rospkg. # 没有创建virtualenv的话,注意需要使用pip3 pip install catkin-tools pip ...

  4. python3.x完全兼容python2.x吗

    python3.x完全兼容python2.x吗? python3.x与python2.x可以说是完全不兼容. Python的3.0版本,常被称为Python 3000,或简称Py3k.相对于Pytho ...

  5. python3代码兼容python2

    python3代码兼容python2的方式 1.使用future特性 Python的每个新版本都会增加一些新的功能,或者对原来的功能作一些改动.有些改动是不兼容旧版本的,也就是在当前版本运行正常的代码 ...

  6. python的pip_同时装了Python3和Python2,怎么用pip?

    转帖-[官解]Windows上Python2和3如何兼容 想学习Python3,但是暂时又离不开Python2.在Windows上如何让它们共存呢? 目前国内网站经常会让大家把其中一个python.e ...

  7. 关于python3与python2同时存在情况下导入pyqt失败解决记录

    最近感觉tkinter功能还是比较不适合新手做出高大上的界面,故开始使用pyqt,通过pip安装好了之后,利用qt设计师设计好界面之后,cmd运行之,报错提示没有找到pyqt5模块,IDE运行能正常加 ...

  8. python3对比python2的更新点

    python3对比python2的更新点: Python2官方基础模块:urllib2 第三方功能包:requests python3中urllib库和urilib2库合并成了urllib库. 其中u ...

  9. python中3or5什么意思_示例详解Python3 or Python2 两者之间的差异

    每门编程语言在发布更新之后,主要版本之间都会发生很大的变化. 在本文中,Vinodh Kumar 通过示例解释了 Python 2 和 Python 3 之间的一些重大差异,以帮助说明语言的变化. 本 ...

最新文章

  1. android audiotrack使用问题:listener不回调的原因
  2. 全国首套中小学生人工智能教材在沪亮相
  3. 【Maven学习】Nexus私服代理其他第三方的Maven仓库
  4. 为什么“或命题真假的判断是有真则真?
  5. 一组图诠释CNN及RNN的区别
  6. c#下实现GUI编程_程序员会懂的冷笑话:各大编程语言的内心独白
  7. windows 启动某些文件的快捷方式 ”系统环境变量?“
  8. SpringMVC的数据响应-页面跳转-返回ModelAndView形式1(应用)
  9. 利用python爬虫(part9)--Xpath与谓词の爱
  10. DevExpress控件介绍
  11. eclipse安装hibernate
  12. 互联网产品经理,全方位入门,图书推荐
  13. 人工智能 2 级就来越塔来杀我,论文已被NeurIPS收录!
  14. 求Decimal的相反数
  15. 浏览器控制台批量删除新浪微博
  16. 世界上第一台计算机论文,世界上公认的第一台电子计算机是1946年诞生。.doc
  17. 测试 Windows 8 中的 Metro 风格应用
  18. 计算机网络 路由协议的配置_瑞尔森大学计算机网络专业
  19. 手机开机后Spreadtrum Factory Test phone test factory used full phone test item test BT EUT exit
  20. 基于CCD摄像头智能车分段PID控制算法设计

热门文章

  1. java使用DES加密方式,实现对数据的加密解密
  2. Quartus报错Error (170040): Can‘t place all RAM cells in design Info (170034)的解决办法
  3. Monkey软件测试工具介绍
  4. 5G应用前景广泛 不止是下电影更快,还能做这些事……
  5. Codeforces Round #529 (Div. 3) D. Circular Dance
  6. docker+MySQL+读写分离
  7. UVa 400 (水题) Unix ls
  8. 谷歌技术quot;三宝quot;之MapReduce
  9. usb 视频设备 按钮消息处理 和普通usb连接的事件处理
  10. ROM PROM EPROM EEPROM FLASH(NAND、NOR)