国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

編寫同時兼容Python2.x與Python3.x版本的代碼的幾個示例

2020-02-23 00:27:07
字體:
供稿:網(wǎng)友

編寫兼容Python2.x與3.x代碼

當(dāng)我們正處于Python 2.x到Python 3.x的過渡期時,你可能想過是否可以在不修改任何代碼的前提下能同時運(yùn)行在Python 2和3中。這看起來還真是一個合理的訴求,但如何開始呢?哪些Python 2 代碼在 3.x 解釋器執(zhí)行時容易出狀況呢?
print vs print()

如果你想的和我一樣,你或許會說print語句,這是個很好的著手點(diǎn),先簡單展示一下,print在2.x中是一條語句,而在3.x中它是一個關(guān)鍵字或者是保留字。換句話說,因為這個變化涉及到語言的語法,你不可以使用在if語句中,Python仍然沒有#ifdef 宏。下面嘗試把括號里面的參數(shù)打印出來:

>>> print('Hello World!')Hello World!

很酷,這個在Python2和Python3中都可以運(yùn)行,而且運(yùn)行的效果是一樣的,再來看看下面這段:
 

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

此時,你并沒有像前面那樣幸運(yùn)得到一樣的結(jié)果,Python2中打印的是元組(tuple),而在Python3中傳遞多個參數(shù)到print()里面時打印的是兩個值:
 

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

如果你思考得比較多的話,我們可以檢查print是否是一個關(guān)鍵字,keyword模塊包含一個關(guān)鍵字列表。print在3.x中不是關(guān)鍵字,可以簡單驗證一下:
 

>>> import keyword>>> 'print' in keyword.kwlistFalse

作為一名聰明的程序員,你可能在2.x中嘗試的時候期待的結(jié)果是True,盡管這并沒有錯,但是為了達(dá)到Python3的效果,但你仍然會因為其他原因?qū)е率 ?br /> 

>>> import keyword>>> if 'print' in keyword.kwlist:...  from __future__ import print_function...File "", line 2SyntaxError: from __future__ imports must occur at the beginning of the file

一種解決方案是使用一個函數(shù),其功能類似于print,其中之一是sys.stdout.write(),另一個是distutils.log.warn()。不管出于什么原因,我們決定使用后者?!癶ello world”的例子看起來是這樣的:
 

# Python 2.xprint 'Hello World!'# Python 3.xprint('Hello World!')

下面的代碼就可以在兩個版本中通用:
 

# Python 2.x & 3.x compatiblefrom distutils.log import warn as printfprintf('Hello World!')

為什么我們不用sys.stdout.write()呢,因為我們需要添加一個NEWLINE字符在字符串的結(jié)尾來兼容這種行為(python2.x中write方法不會換行):
 

# Python 2.x & 3.x compatibleimport syssys.stdout.write('Hello World!n')

Import your way to a solution

一般情況情況下,import時沒什么煩惱,只要正確的導(dǎo)入就行,但在下面代碼中,我們想導(dǎo)入urlopen()函數(shù),在Python2中,他同時存在與urllib2和urllib2中(我們使用后者),在Python3中,他被集成到了urllib.request中,而你的方案是要既能在2.x和3.x中正常工作:

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 宁阳县| 桂东县| 泽州县| 湘潭市| 买车| 灌阳县| 八宿县| 峨边| 文水县| 平武县| 五峰| 婺源县| 三台县| 琼海市| 洪江市| 夏邑县| 鄂尔多斯市| 新干县| 财经| 杭锦后旗| 涿州市| 双峰县| 曲水县| 长宁区| 防城港市| 神木县| 铜山县| 十堰市| 镇雄县| 溧阳市| 秦皇岛市| 醴陵市| 中牟县| 枣阳市| 界首市| 合川市| 凌源市| 谷城县| 莱芜市| 焦作市| 右玉县|