在线二区人妖系列_国产亚洲欧美日韩在线一区_国产一级婬片视频免费看_精品少妇一区二区三区在线

鍍金池/ 教程/ Python/ 22. 目標(biāo)Python2+3
<code>open</code>函數(shù)
Python 2系列版本
可迭代對(duì)象(Iterable)
異常
在函數(shù)中嵌入裝飾器
你的第一個(gè)裝飾器
上下文管理器(Context managers)
<code>set</code>(集合)數(shù)據(jù)結(jié)構(gòu)
裝飾器類(lèi)
字典推導(dǎo)式(<code>dict</code> comprehensions)
<code>Reduce</code>
捐贈(zèng)名單
<code>Filter</code>
<code>try/else</code>從句
*args 的用法
<code>dir</code>
處理異常
<code>else</code>從句
對(duì)象自省
For - Else
18. 一行式
Python 3.2及以后版本
Global和Return
基于類(lèi)的實(shí)現(xiàn)
容器(<code>Collections</code>)
23. 協(xié)程
推薦閱讀
譯者后記
<code>*args</code> 和 <code>**kwargs</code>
**kwargs 的用法
生成器(Generators)
迭代(Iteration)
基于生成器的實(shí)現(xiàn)
將函數(shù)作為參數(shù)傳給另一個(gè)函數(shù)
日志(Logging)
三元運(yùn)算符
<code>inspect</code>模塊
枚舉
Map,F(xiàn)ilter 和 Reduce
各種推導(dǎo)式(comprehensions)
從函數(shù)中返回函數(shù)
列表推導(dǎo)式(<code>list</code> comprehensions)
處理多個(gè)異常
帶參數(shù)的裝飾器
對(duì)象變動(dòng)(Mutation)
22. 目標(biāo)Python2+3
迭代器(Iterator)
虛擬環(huán)境(virtualenv)
<code>__slots__</code>魔法
什么時(shí)候使用它們?
Python/C API
<code>Map</code>
SWIG
授權(quán)(Authorization)
裝飾器
一切皆對(duì)象
使用C擴(kuò)展
使用 <code>*args</code> 和 <code>**kwargs</code> 來(lái)調(diào)用函數(shù)
17. <code>lambda</code>表達(dá)式
集合推導(dǎo)式(<code>set</code> comprehensions)
<code>type</code>和<code>id</code>
在函數(shù)中定義函數(shù)
<code>finally</code>從句
CTypes
調(diào)試(Debugging)
使用場(chǎng)景
生成器(Generators)
多個(gè)return值
關(guān)于原作者
函數(shù)緩存 (Function caching)
Python進(jìn)階

22. 目標(biāo)Python2+3

很多時(shí)候你可能希望你開(kāi)發(fā)的程序能夠同時(shí)兼容Python2+和Python3+。

試想你有一個(gè)非常出名的Python模塊被很多開(kāi)發(fā)者使用著,但并不是所有人都只使用Python2或者Python3。這時(shí)候你有兩個(gè)辦法。第一個(gè)辦法是開(kāi)發(fā)兩個(gè)模塊,針對(duì)Python2一個(gè),針對(duì)Python3一個(gè)。還有一個(gè)辦法就是調(diào)整你現(xiàn)在的代碼使其同時(shí)兼容Python2和Python3。

本節(jié)中,我將介紹一些技巧,讓你的腳本同時(shí)兼容Python2和Python3。

Future模塊導(dǎo)入

第一種也是最重要的方法,就是導(dǎo)入__future__模塊。它可以幫你在Python2中導(dǎo)入Python3的功能。這有一組例子:

上下文管理器是Python2.6+引入的新特性,如果你想在Python2.5中使用它可以這樣做:

from __future__ import with_statement

在Python3中print已經(jīng)變?yōu)橐粋€(gè)函數(shù)。如果你想在Python2中使用它可以通過(guò)__future__導(dǎo)入:

print
# Output:

from __future__ import print_function
print(print)
# Output: <built-in function print>

模塊重命名

首先,告訴我你是如何在你的腳本中導(dǎo)入模塊的。大多時(shí)候我們會(huì)這樣做:

import foo 
# or
from foo import bar

你知道么,其實(shí)你也可以這樣做:

import foo as foo

這樣做可以起到和上面代碼同樣的功能,但最重要的是它能讓你的腳本同時(shí)兼容Python2和Python3?,F(xiàn)在我們來(lái)看下面的代碼:

try:
    import urllib.request as urllib_request  # for Python 3
except ImportError:
    import urllib2 as urllib_request  # for Python 2

讓我來(lái)稍微解釋一下上面的代碼。
我們將模塊導(dǎo)入代碼包裝在try/except語(yǔ)句中。我們是這樣做是因?yàn)樵赑ython 2中并沒(méi)有urllib.request模塊。這將引起一個(gè)ImportError異常。而在Python2中urllib.request的功能則是由urllib2提供的。所以,當(dāng)我們?cè)噲D在Python2中導(dǎo)入urllib.request模塊的時(shí)候,一旦我們捕獲到ImportError我們將通過(guò)導(dǎo)入urllib2模塊來(lái)代替它。

最后,你要了解as關(guān)鍵字的作用。它將導(dǎo)入的模塊映射到urllib.request,所以我們通過(guò)urllib_request這個(gè)別名就可以使用urllib2中的所有類(lèi)和方法了。

過(guò)期的Python2內(nèi)置功能

另一個(gè)需要了解的事情就是Python2中有12個(gè)內(nèi)置功能在Python3中已經(jīng)被移除了。要確保在Python2代碼中不要出現(xiàn)這些功能來(lái)保證對(duì)Python3的兼容。這有一個(gè)強(qiáng)制讓你放棄12內(nèi)置功能的方法:

from future.builtins.disabled import *

現(xiàn)在,只要你嘗試在Python3中使用這些被遺棄的模塊時(shí),就會(huì)拋出一個(gè)NameError異常如下:

from future.builtins.disabled import *

apply()
# Output: NameError: obsolete Python 2 builtin apply is disabled

標(biāo)準(zhǔn)庫(kù)向下兼容的外部支持

有一些包在非官方的支持下為Python2提供了Python3的功能。例如,我們有:

  • enum pip install enum34
  • singledispatch pip install singledispatch
  • pathlib pip install pathlib

想更多了解,在Python文檔中有一個(gè)全面的指南可以幫助你讓你的代碼同時(shí)兼容Python2和Python3。