返回顶部
首页 > 资讯 > 后端开发 > Python >编写兼容 Python 2.x 和 3.
  • 744
分享到

编写兼容 Python 2.x 和 3.

Python 2023-01-31 07:01:09 744人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

编写兼容python2.x与3.x代码当我们正处于Python 2.x到Python 3.x的过渡期时,你可能想过是否可以在不修改任何代码的前提下能同时运行在Python 2和3中。这看起来还真是一个合理的诉求,但如何开始呢?哪些Pytho

编写兼容python2.x与3.x代码


当我们正处于Python 2.x到Python 3.x的过渡期时,你可能想过是否可以在不修改任何代码的前提下能同时运行在Python 2和3中。这看起来还真是一个合理的诉求,但如何开始呢?哪些Python 2 代码在 3.x 解释器执行时容易出状况呢?


print vs print()


如果你想的和我一样,你或许会说print语句,这是个很好的着手点,先简单展示一下,print在2.x中是一条语句,而在3.x中它是一个关键字或者是保留字。换句话说,因为这个变化涉及到语言的语法,你不可以使用在if语句中,Python仍然没有#ifdef 宏。下面尝试把括号里面的参数打印出来:


>>> print('Hello World!')

Hello World!


很酷,这个在Python2和python3中都可以运行,而且运行的效果是一样的,再来看看下面这段:


>>> print(10, 20) # Python 2

(10, 20)


此时,你并没有像前面那样幸运得到一样的结果,Python2中打印的是元组(tuple),而在Python3中传递多个参数到print()里面时打印的是两个值:


>>> print(10, 20) # Python 3

10 20


如果你思考得比较多的话,我们可以检查print是否是一个关键字,keyWord模块包含一个关键字列表。print在3.x中不是关键字,可以简单验证一下:


>>> import keyword

>>> 'print' in keyword.kwlist

False


作为一名聪明的程序员,你可能在2.x中尝试的时候期待的结果是True,尽管这并没有错,但是为了达到Python3的效果,但你仍然会因为其他原因导致失败。


>>> import keyword

>>> if 'print' in keyword.kwlist:

...     from __future__ import print_function

...

File "", line 2

SyntaxError: from __future__ imports must occur at the beginning of the file


一种解决方案是使用一个函数,其功能类似于print,其中之一是sys.stdout.write(),另一个是distutils.log.warn()。不管出于什么原因,我们决定使用后者。“hello world”的例子看起来是这样的:


# Python 2.x

print 'Hello World!'

# Python 3.x

print('Hello World!')


下面的代码就可以在两个版本中通用:


# Python 2.x & 3.x compatible

from distutils.log import warn as printf

printf('Hello World!')


为什么我们不用sys.stdout.write()呢,因为我们需要添加一个NEWLINE字符在字符串的结尾来兼容这种行为(python2.x中write方法不会换行):


# Python 2.x & 3.x compatible

import sys

sys.stdout.write('Hello World!n')


Import your way to a solution


一般情况情况下,import时没什么烦恼,只要正确的导入就行,但在下面代码中,我们想导入urlopen()函数,在Python2中,他同时存在与urllib2和urllib2中(我们使用后者),在Python3中,他被集成到了urllib.request中,而你的方案是要既能在2.x和3.x中正常工作:


try:

    from urllib2 import urlopen

except ImportError:

    from urllib.request import urlopen


出于对内存的保护,也许你对iterator(Python3)版本的zip()更加有兴趣,在Python2中,iterator版本是itertools.izip()。这个函数在Python3中被重命名替换成了zip()。如果你使用迭代版本,导入语句也非常直白:


try:

    from itertools import izip as zip

except ImportError:

    pass


另一个列子是看来来并不怎么优雅的StringIO类,在Python2中,纯Python版本是StringIO模块,意味着访问的时候是通过StringIO.StringIO,同样还有一个更为快速的C语言版本,位于cStringIO.StringIO,不过这取决你的Python安装版本,你可以优先使用cStringIO然后是StringIO(如果cStringIO不能用的话)。在Python3中,Unicode是默认的string类型,但是如果你做任何和网络相关的操作,很有可能你不得不用ASCII/字节字符串来操作,所以代替StringIO,你要io.BytesIO,为了达到你想要的,这个导入看起来有点丑:


try:

    from io import BytesIO as StringIO

except ImportError:

    try:

        from cStringIO import StringIO

    except ImportError:

        from StringIO import StringIO


Putting it all together


如果你运气好的话,上面那些就是你要准备做的全部,剩下的代码都比开始设置的地方更简单。如果你按照上面的方式导入了distutils.log.warn()[printf()],url*urlopen(),*.StringIO和一个标准的导入:xml.etree.ElementTree(2.5及更新的),现在你就可以写一个非常简短短的解析器来展示从Google News服务中提供的头条故事(译注:当然首先得备一个×××),只需八行代码:


g = urlopen('Http://news.google.com/news?topic=h&output=rss')

f = StringIO(g.read())

g.close()

tree = xml.etree.ElementTree.parse(f)

f.close()

for elmt in tree.getiterator():

    if elmt.tag == 'title' and not

            elmt.text.startswith('Top Stories'):

        printf('- %s' % elmt.text)


这段脚本在2.x和3.x下面运行时,不需要做任何改动,运行效果完全一样,当然,如果你正在使用的是2.4或者更老的版本,你需要单独下载ElementTree。


但是有时候感觉这些改变把你优雅的Python代码弄得一团糟,毕竟可读性才是最重要的,如果你要优先保证代码的整洁而且在不修改任何地方的前提下运行在两个版本的Python环境中,那么你可以看一下six包。


six一个兼容库,它的主要任务是提供接口隐藏复杂的细节,你可以在这里找到它。无论你是使用像six这样的库还是用自己的方法来做,我们希望这个简短的介绍可以让你开始考虑写的代码能够在2.x和3.x下同时运行。


--结束END--

本文标题: 编写兼容 Python 2.x 和 3.

本文链接: https://lsjlt.com/news/191855.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 编写兼容 Python 2.x 和 3.
    编写兼容Python2.x与3.x代码当我们正处于Python 2.x到Python 3.x的过渡期时,你可能想过是否可以在不修改任何代码的前提下能同时运行在Python 2和3中。这看起来还真是一个合理的诉求,但如何开始呢?哪些Pytho...
    99+
    2023-01-31
    Python
  • python笔记之2.x上兼容3.x版本
    在前文《python笔记之3.x与2.x的使用区别》谈及了不同版本的区别问题。长远看软件新版本肯定会取代低版本的,除非你有成熟的老版本代码必须考虑兼容性问题,一般还是推荐新手学习新版本。 最近学习python,主要使用3.3版本,但看代码和...
    99+
    2023-01-31
    版本 笔记 python
  • Python 3.x 编解码
    #-- coding:gbk -- 指定文件编码#Author:leiimport sysprint(sys.getdefaultencoding())s = "你好"print(s)print(s.encode("gbk")) #编码...
    99+
    2023-01-31
    编解码 Python
  • Python 2.7.x 和 3.x 版
    python现在很火,最近花了些时间去了解了一下,最初了解的是2.7.x版本,感觉,从书写上是很不习惯,少了一双大概号,取而代之的是缩进;然后跟kotlin和swift一样省去了每行的分号,象我们这种分号强迫症的人真心的不习惯;还有!Tru...
    99+
    2023-01-31
    Python
  • python笔记之3.x与2.x的使用区
    python目前有两个分支:2.7.3和3.3.0,基本用法大同小异,但在个别细节上还是有出入的,具体看python.org网站。 个人感觉的差异有: 1、py3默认就是unicode,终于在写程序时可以不用再考虑中文...
    99+
    2023-01-31
    笔记 python
  • Python 2 和 Python 3
      Guido(Python之父,仁慈的独裁者)在设计 Python3 的过程中,受一篇文章 “Python warts” 的影响,决定不向后兼容,否则无法修复大多数缺陷。---摘录自《流畅的Python》   你可能从来没有听说过学 J...
    99+
    2023-01-31
    Python
  • Django版本比较:1.x、2.x和3.x有何不同?
    Django是一个高度可扩展的Python Web框架,它旨在帮助开发者更快、更轻松地构建Web应用程序。随着时间的推移,Django不断发展和更新,目前最新的稳定版是3.x系列。本文将比较Django 1.x、2.x和3.x三...
    99+
    2024-01-19
    版本 比较 x
  • jquery版本2.x和3.x的区别有哪些
    这篇文章主要讲解了“jquery版本2.x和3.x的区别有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“jquery版本2.x和3.x的区别有哪些”吧!...
    99+
    2024-04-02
  • Python 3.x中的编码和解码问题
    最近在极客学院学习爬虫,老师用的是2.x版本,而我电脑里的版本是3.x,于是在网页上查找在输出中文时如何正确输出。 我原以为2.x 3.x在很多语法上没什么区别,在解码decode上应该也差不多,没想到竟然发现,很多博客提到2....
    99+
    2023-01-31
    Python
  • Python 2与Python 3版本和编码的对比
    一、版本对比 首先要说的是,Python的版本,目前主要分为两大类: Python 2.x的版本的,被称为Python2:是目前用的最广泛的,比如Python 2.7.3。 Python 3.x的版本的,被...
    99+
    2022-06-04
    版本 Python
  • Python 2和Python 3的区别
    原文转载自:http://www.pythontip.com/blog/post/13118/1.性能 Py3.0运行 pystone benchmark的速度比Py2.5慢30%。Guido认为Py3.0有极大的优化空间,在字符串和×××...
    99+
    2023-01-31
    区别 Python
  • 疯狂上涨的Python 开发者应从2.x还是3.x着手?
    纵观各大编程语言在 2017 年的发展情况,我们会发现涌现出诸如 Go、Swift 这类后起之秀,而其中最为耀眼的当属 Python。之所以 Python 如此受捧,不仅仅是人工智能、数字科学领域的兴起,而...
    99+
    2022-06-04
    开发者 疯狂 Python
  • 如何编写IE7与FF下的letter-spacing属性兼容性
    本篇内容介绍了“如何编写IE7与FF下的letter-spacing属性兼容性”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅...
    99+
    2024-04-02
  • Python GUI 编程:跨平台兼容性的挑战
    ...
    99+
    2024-04-02
  • PHP截断标题且兼容utf8和gb2312编码
    复制代码 代码如下: <php if(strlen($r[title])>45){$str=utf8Substr($r[title],0,15)."...";}...
    99+
    2022-11-15
    PHP截断标题 utf8 gb2312
  • 1)python的基础2和3的区别,以及
    1、python2\python3的区别:python2\python3的区别:一、代码重复,python2代码重复功能复用,夹杂其他语言的部分,不规范python3进行整合,简洁优美编译型:一次性将全部代码编译成二进制,然后再运行。缺点:...
    99+
    2023-01-31
    区别 基础 python
  • #3 Python解释器和编辑器
    前言 上文介绍了Python在不同平台的安装方法,本文将带领你了解Python解释器和编辑器的概念,并且选择出最符合自己的解释器和编辑器! 一、Python解释器 其实上文介绍的安装Python,实质上安装的是Python解释器。当你创建...
    99+
    2023-01-30
    编辑器 Python
  • Go 和 Python 之间的 Murmur3 哈希兼容性
    php小编子墨为您介绍Go和Python之间的Murmur3哈希兼容性。Murmur3是一种高效的哈希算法,常用于数据结构和算法中的散列操作。在Go和Python这两种编程语言中,Mu...
    99+
    2024-02-09
  • 兼容IE6或IE7的min-width和max-width写法有哪些
    今天就跟大家聊聊有关兼容IE6或IE7的min-width和max-width写法有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。很多时候,我们...
    99+
    2024-04-02
  • Python升级和兼容性配置是怎样的
    Python升级和兼容性配置是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Python里面有个现象很奇怪,一般要学习Python都会纠结是学习2和3,这个差别和纠结Ja...
    99+
    2023-06-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作