zoukankan      html  css  js  c++  java
  • python2 和 python3兼容写法

    一:使用ImportError,Python3中将一些Python2的模块名称做了修改,需要我们做一些处理来保证代码在不同Python版本中能够正常运行

    # -*- coding: utf-8 -*-
     
    try:
        # Python3
        from configparser import ConfigParser
    except ImportError:
        # Python2
        from ConfigParser import ConfigParser
     
    config = ConfigParser()
     
    # do something

    urllib库也是不兼容Python2和Python3的

    # -*- coding: utf-8 -*-
     
    try:
        # Python2
        from urllib import urlencode  
        from urllib import quote
        from urlparse import urlparse
        import urllib2 as request
    except ImportError:
        # Python3
        from urllib.parse import urlencode  
        from urllib.parse import quote
        from urllib.parse import urlparse
        import urllib.request as request
     
    # do something


    二:根据版本来判断

    根据sys.version_info.major来判断Python的版本,根据不同的版本导入不同的库。

    # -*- coding: utf-8 -*-
    import sys
     
    if sys.version_info.major == 2:
        # Python2
        from urllib import urlencode
        from urllib import quote
        from urlparse import urlparse
        import urllib2 as request
    else:
        # Python3
        from urllib.parse import urlencode  
        from urllib.parse import quote
        from urllib.parse import urlparse
        import urllib.request as request
    # do something

    三、使用脚本将py2代码转为py3

    使用命令2to3 -w file.py可以直接在原地修改文件。其他命令可以使用2to3 --help查看;2to3 file.py可以看到转变前后的内容对比

    2to3是python自带的一个代码转换工具,可以将python2的代码自动转换为python3的代码。当然,不幸的是转换出的代码并没有对python2的兼容做任何的处理。所以我们并不真正使用2to3转换出的代码。执行 2to3 file.py 查看输出信息,并修正相关问题。

    四、使用python -3执行python程序

    2to3 可以检查出很多python2&3的兼容性问题,但也有很多问题是2to3发现不了的。在加上 -3 参数后,程序在运行时会在控制台上将python2和python3不一致,同时2to3无法处理的问题提示出来。比如python3和python2中对除法的处理规则做过改变。使用-3参数执行4/2将提示 DeprecationWarning: classic int division 。

    python -3 file.py

    五、使用__future__导入

    使用python3的print函数,禁用python2的print语句:from __future__ import print_function

    像python3一样,int除以int得float,而不像Python2那样是整除:from __future__ import division  
    

    像python3一样,字符串字面量的类型为文本(python2中的unicode,python3中的str),而不是字节(python2中的str,python3中的bytes)

    from __future__ import unicode_literal

     

    python2和python3的print不完全一样,print在python2中是个关键字,是个函数

    Python3Python2
    input() raw.input(),sys.readline()
    整除// /
    Python3Python2
    unittest.mock.MagicMock mock.MagicMock
    urllib.request.urlretrieve urllib.urlretrieve
    queue Queue
    functools.reduce reduce

    列表推导式的变量作用域

    在Python2中,列表推导式中的索引变量的是可以泄露到其封闭作用域中的。而Python3中则不可以。
    下面举一个简单的例子说明这个问题,如我们在一个for循环内部使用列表推导式

    for i in range(2):
        a = [i for i in range(5)]
        print(i)
    1
    2
    3
    在Python3中,上面的代码输出为

    >>0
    >>1
    1
    2
    而在Python2中,上面的代码输出为

    >>4
    >>4

    参考:

    http://python.jobbole.com/83987/

    https://blog.csdn.net/u012151283/article/details/58049151

  • 相关阅读:
    附近有什么?8款可以查周边的App
    实体店里充话费要怎么弄
    怎样买手机号?
    手机号是SIM卡的号呢,还是买手机时就带的
    网站SSL证书在线检测
    未来什么行业最赚钱
    陈安之-如何选择最赚钱的行业
    斗鱼宣布获C轮15亿融资 直播行业进入资本时代
    2016年Godaddy最新域名转出教程
    GoDaddy账户间域名转移PUSH以及ACCEPT接受域名过户方法
  • 原文地址:https://www.cnblogs.com/shengulong/p/10176903.html
Copyright © 2011-2022 走看看