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中是個關鍵字,是個函數

 

 

Python3 Python2
input() raw.input(),sys.readline()
整除// /

 

 

Python3 Python2
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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM