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.requestas 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 requestelse: # 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