python2 和 python3相容寫法

2021-09-07 20:50:20 字數 3208 閱讀 4064

一:使用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

asrequest

except importerror:

# python3

from

urllib.parse import urlencode

from

urllib.parse import quote

from

urllib.parse import urlparse

import urllib.request

asrequest #

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

asrequest

else

: # python3

from

urllib.parse import urlencode

from

urllib.parse import quote

from

urllib.parse import urlparse

import urllib.request

asrequest

# 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

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)12

3在python3中,上面的**輸出為

>>0

>>112

而在python2中,上面的**輸出為

>>4

>>4

參考:

python3和python2的區別

1.效能 py3.0執行 pystone benchmark的速度比py2.5慢30 guido認為py3.0有極大的優化空間,在字串和整形操作上可 以取得很好的優化結果。py3.1效能比py2.5慢15 還有很大的提公升空間。2.編碼 py3.x原始碼檔案預設使用utf 8編碼,這就使得以下 是合...

Python2和Python3的比較

python2 python3 print fish print fish unicode 是單獨的 unicode utf 8 字串 b b china byte 和 bytearrays type b type bytes s b.decode 轉化成 string 型別b1 s encode ...

python3和python2的區別

這個星期開始學習python了,因為看的書都是基於python2.x,而且我安裝的是python3.1,所以書上寫的地方好多都不適用於python3.1,特意在google上search了一下3.x和2.x的區別。特此在自己的空間中記錄一下,以備以後查詢方便,也可以分享給想學習python的frie...