map python2 python3 兼容,Python2与Python3兼容
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兼容相关推荐
- map python2 python3 兼容_windows下 兼容Python2和Python3的解决方法
windows下同时安装了python2和python3时,都可以配置环境变量,如果在命令行里输入python命令,windows会去环境变量里寻找Python的安装位置,如果先找到pytoon2的, ...
- 同时兼容Python2和Python3的字符串判断语句
文章信息 作者:史晨 Charles Shih 创建时间:2018年08月24日 问题描述 我之前写过一个测试脚本,解释器用的是Python2.7,在RHEL7上用起来是没有问题的.但是最近要在RHE ...
- 在ROS中兼容Python3和Python2
1. 安装相应的Package 需要安装catkin-tools和rospkg. # 没有创建virtualenv的话,注意需要使用pip3 pip install catkin-tools pip ...
- python3.x完全兼容python2.x吗
python3.x完全兼容python2.x吗? python3.x与python2.x可以说是完全不兼容. Python的3.0版本,常被称为Python 3000,或简称Py3k.相对于Pytho ...
- python3代码兼容python2
python3代码兼容python2的方式 1.使用future特性 Python的每个新版本都会增加一些新的功能,或者对原来的功能作一些改动.有些改动是不兼容旧版本的,也就是在当前版本运行正常的代码 ...
- python的pip_同时装了Python3和Python2,怎么用pip?
转帖-[官解]Windows上Python2和3如何兼容 想学习Python3,但是暂时又离不开Python2.在Windows上如何让它们共存呢? 目前国内网站经常会让大家把其中一个python.e ...
- 关于python3与python2同时存在情况下导入pyqt失败解决记录
最近感觉tkinter功能还是比较不适合新手做出高大上的界面,故开始使用pyqt,通过pip安装好了之后,利用qt设计师设计好界面之后,cmd运行之,报错提示没有找到pyqt5模块,IDE运行能正常加 ...
- python3对比python2的更新点
python3对比python2的更新点: Python2官方基础模块:urllib2 第三方功能包:requests python3中urllib库和urilib2库合并成了urllib库. 其中u ...
- python中3or5什么意思_示例详解Python3 or Python2 两者之间的差异
每门编程语言在发布更新之后,主要版本之间都会发生很大的变化. 在本文中,Vinodh Kumar 通过示例解释了 Python 2 和 Python 3 之间的一些重大差异,以帮助说明语言的变化. 本 ...
最新文章
- android audiotrack使用问题:listener不回调的原因
- 全国首套中小学生人工智能教材在沪亮相
- 【Maven学习】Nexus私服代理其他第三方的Maven仓库
- 为什么“或命题真假的判断是有真则真?
- 一组图诠释CNN及RNN的区别
- c#下实现GUI编程_程序员会懂的冷笑话:各大编程语言的内心独白
- windows 启动某些文件的快捷方式 ”系统环境变量?“
- SpringMVC的数据响应-页面跳转-返回ModelAndView形式1(应用)
- 利用python爬虫(part9)--Xpath与谓词の爱
- DevExpress控件介绍
- eclipse安装hibernate
- 互联网产品经理,全方位入门,图书推荐
- 人工智能 2 级就来越塔来杀我,论文已被NeurIPS收录!
- 求Decimal的相反数
- 浏览器控制台批量删除新浪微博
- 世界上第一台计算机论文,世界上公认的第一台电子计算机是1946年诞生。.doc
- 测试 Windows 8 中的 Metro 风格应用
- 计算机网络 路由协议的配置_瑞尔森大学计算机网络专业
- 手机开机后Spreadtrum Factory Test phone test factory used full phone test item test BT EUT exit
- 基于CCD摄像头智能车分段PID控制算法设计
热门文章
- java使用DES加密方式,实现对数据的加密解密
- Quartus报错Error (170040): Can‘t place all RAM cells in design Info (170034)的解决办法
- Monkey软件测试工具介绍
- 5G应用前景广泛 不止是下电影更快,还能做这些事……
- Codeforces Round #529 (Div. 3) D. Circular Dance
- docker+MySQL+读写分离
- UVa 400 (水题) Unix ls
- 谷歌技术quot;三宝quot;之MapReduce
- usb 视频设备 按钮消息处理 和普通usb连接的事件处理
- ROM PROM EPROM EEPROM FLASH(NAND、NOR)