真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

python輔助函數(shù) Python輔助

在Python中使用Asyncio系統(tǒng)(3-4)Task 和 Future

Task 和 Future

平塘網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站,平塘網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為平塘成百上千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢,請找那個(gè)售后服務(wù)好的平塘做網(wǎng)站的公司定做!

前面我們討論了協(xié)程,以及如何在循環(huán)中運(yùn)行它們才有用?,F(xiàn)在我想簡單談?wù)凾ask和Future api。你將使用最多的是Task,因?yàn)槟愕拇蟛糠止ぷ鲗⑸婕笆褂胏reate_task()函數(shù)運(yùn)行協(xié)程,就像在第22頁的“快速開始”中設(shè)置的那樣。Future類實(shí)際上是Task的超類,它提供了與循環(huán)交互操作的所有功能。

可以這樣簡單地理解:Future表示某個(gè)活動(dòng)的未來完成狀態(tài),并由循環(huán)管理。Task是完全相同的,但是具體的“activity”是一個(gè)協(xié)程——可能是你用async def函數(shù)加上create_task()創(chuàng)建的協(xié)程。

Future類表示與循環(huán)交互的某個(gè)東西的狀態(tài)。這個(gè)描述太模糊了,不太有用,所以你可以將Future實(shí)例視為一個(gè)切換器,一個(gè)完成狀態(tài)的切換器。當(dāng)創(chuàng)建Future實(shí)例時(shí),切換設(shè)置為“尚未完成”狀態(tài),但稍后它將是“完成”狀態(tài)。事實(shí)上,F(xiàn)uture實(shí)例有一個(gè)名為done()的方法,它允許你檢查狀態(tài),如示例 3-15所示。

示例 3-15. 用done()方法檢查完成狀態(tài)

Future實(shí)例還可以執(zhí)行以下操作:

? 設(shè)置一個(gè)result值(用.set_result(value)設(shè)置值并且使用 .result()獲取值)

? 使用.cancel()方法取消 (并且會(huì)用使用.cancelled()檢查是否取消)

? 增加一個(gè)Future完成時(shí)回調(diào)的函數(shù)

即使Task更常見,也不可能完全避免使用Future:例如,在執(zhí)行器上運(yùn)行函數(shù)將返回Future實(shí)例,而不是Task。讓我們快速看一下 示例 3-16 ,了解一下直接使用Future實(shí)例是什么感覺。

示例 3-16. 與Future實(shí)例的交互

(L3)創(chuàng)建一個(gè)簡單的 main函數(shù)。我們運(yùn)行這個(gè)函數(shù),等上一會(huì)兒然后在Future f上設(shè)置一個(gè)結(jié)果。

(L5)設(shè)置一個(gè)結(jié)果。

(L8)手動(dòng)創(chuàng)建一個(gè)Future實(shí)例。注意,這個(gè)實(shí)例(默認(rèn)情況下)綁定到我們的循環(huán),但它沒有也不會(huì)被附加到任何協(xié)程(這就是Tasks的作用)。

(L9)在做任何事情之前,確認(rèn)future還沒有完成。

(L11)安排main()協(xié)程,傳遞future。請記住,main()協(xié)程所做的所有工作就是sleep,然后切換Future實(shí)例。(注意main()協(xié)程還不會(huì)開始運(yùn)行:協(xié)程只在事件循環(huán)運(yùn)行時(shí)才開始運(yùn)行。)

(L13)在這里我們在Future實(shí)例上而不是Task實(shí)例上使用run_until_complete()。這和你以前見過的不一樣?,F(xiàn)在循環(huán)正在運(yùn)行,main()協(xié)程將開始執(zhí)行.

(L16)最終,當(dāng)future的結(jié)果被設(shè)置時(shí),它就完成了。完成后,可以訪問結(jié)果。

當(dāng)然,你不太可能以這里所示的方式直接使用Future;代碼示例僅用于教育目的。你與asynccio的大部分聯(lián)系都是通過Task實(shí)例進(jìn)行的。

你可能想知道如果在Task實(shí)例上調(diào)用set_result()會(huì)發(fā)生什么。在Python 3.8之前可以這樣做,但現(xiàn)在不允許這么做了。任務(wù)實(shí)例是協(xié)程對象的包裝器,它們的結(jié)果值只能在內(nèi)部設(shè)置為底層協(xié)程函數(shù)的結(jié)果,如 示例 3-17所示那樣。

示例 3-17. 在task上調(diào)用set_result

(L13)唯一的區(qū)別是我們創(chuàng)建的是Task實(shí)例而不是Future實(shí)例。當(dāng)然,Task API要求我們提供一個(gè)協(xié)程;這里我們使用sleep()只是因?yàn)楹唵畏奖恪?/p>

(L7)正在傳入一個(gè)Task實(shí)例。它滿足函數(shù)的類型簽名(因?yàn)門ask是Future的子類),但從Python 3.8開始,我們不再允許在Task上調(diào)用set_result():嘗試這樣做將引發(fā)RuntimeError。這個(gè)想法是,一個(gè)Task代表一個(gè)正在運(yùn)行的協(xié)程,所以結(jié)果應(yīng)該總是來自于task自身。

(L10, L24)但是,我們?nèi)匀豢梢詂ancel()一個(gè)任務(wù),它將在底層協(xié)程中引發(fā)CancelledError。

Create_task? Ensure_Future? 下定決心吧!

在第22頁的“快速入門”中,我說過運(yùn)行協(xié)程的方法是使用asyncio.create_task()。在引入該函數(shù)之前,有必要獲取一個(gè)循環(huán)實(shí)例并使用loop.create_task()完成相同的任務(wù)。事實(shí)上,這也可以通過一個(gè)不同的模塊級函數(shù)來實(shí)現(xiàn):asyncio.ensure_future()。一些開發(fā)人員推薦create_task(),而其他人推薦ensure_future()。

在我為這本書做研究的過程中,我確信API方法asyncio.ensure_future()是引起對asyncio庫廣泛誤解的罪魁禍?zhǔn)?。API的大部分內(nèi)容都非常清晰,但在學(xué)習(xí)過程中還存在一些嚴(yán)重的障礙,這就是其中之一。當(dāng)你遇到ensure_future()時(shí),你的大腦會(huì)非常努力地將其集成到關(guān)于asyncio應(yīng)該如何使用的心理模型中——但很可能會(huì)失敗!

在Python 3.6 asyncio 文檔中,這個(gè)現(xiàn)在已經(jīng)臭名昭著的解釋突出了 ensure_future() 的問題:

asyncio.ensure_future(coro_or_future, *, _loop =None)

安排執(zhí)行一個(gè)協(xié)程對象:把它包裝在future中。返回一個(gè)Task對象。如果參數(shù)是Future,則直接返回。

什么!? 當(dāng)我第一次讀到這篇文章時(shí),我很困惑。下面希望是對ensure_future()的更清楚的描述:

這個(gè)函數(shù)很好地說明了針對終端用戶開發(fā)人員的asyncio API(高級API)和針對框架設(shè)計(jì)人員的asyncio API(低級API)之間的區(qū)別。讓我們在示例 3-18中自習(xí)看看它是如何工作的。

示例 3-18. 仔細(xì)看看ensure_future()在做什么

(L3)一個(gè)簡單的什么都不做的協(xié)程函數(shù)。我們只需要一些能組成協(xié)程的東西。

(L6)我們通過直接調(diào)用該函數(shù)來創(chuàng)建協(xié)程對象。你的代碼很少會(huì)這樣做,但我想在這里明確地表示,我們正在向每個(gè)create_task()和ensure_future()傳遞一個(gè)協(xié)程對象。

(L7)獲取一個(gè)循環(huán)。

(L9)首先,我們使用loop.create_task()在循環(huán)中調(diào)度協(xié)程,并返回一個(gè)新的Task實(shí)例。

(L10)驗(yàn)證類型。到目前為止,沒有什么有趣的。

(L12)我們展示了asyncio.ensure_future()可以被用來執(zhí)行與create_task()相同的動(dòng)作:我們傳入了一個(gè)協(xié)程,并返回了一個(gè)Task實(shí)例(并且協(xié)程已經(jīng)被安排在循環(huán)中運(yùn)行)!如果傳入的是協(xié)程,那么loop.create_task()和asyncio.ensure_future()之間沒有區(qū)別。

(L15)如果我們給ensure_future()傳遞一個(gè)Task實(shí)例會(huì)發(fā)生什么呢?注意我們要傳遞的Task實(shí)例是已經(jīng)在第4步通過loop.create_task()創(chuàng)建好的。

(L16)返回的Task實(shí)例與傳入的Task實(shí)例完全相同:它在被傳遞時(shí)沒有被改變。

直接傳遞Future實(shí)例的意義何在?為什么用同一個(gè)函數(shù)做兩件不同的事情?答案是,ensure_future()的目的是讓框架作者向最終用戶開發(fā)者提供可以處理兩種參數(shù)的API。不相信我?這是ex-BDFL自己說的:

ensure_future()的要點(diǎn)是,如果你有一個(gè)可能是協(xié)程或Future(后者包括一個(gè)Task,因?yàn)樗荈uture的子類)的東西,并且你想能夠調(diào)用一個(gè)只在Future上定義的方法(可能唯一有用的例子是cancel())。當(dāng)它已經(jīng)是Future(或Task)時(shí),它什么也不做;當(dāng)它是協(xié)程時(shí),它將它包裝在Task中。

如果您知道您有一個(gè)協(xié)程,并且希望它被調(diào)度,那么正確的API是create_task()。唯一應(yīng)該調(diào)用ensure_future()的時(shí)候是當(dāng)你提供一個(gè)API(像大多數(shù)asyncio自己的API),它接受協(xié)程或Future,你需要對它做一些事情,需要你有一個(gè)Future。

—Guido van Rossum

總而言之,asyncio.sure_future()是一個(gè)為框架設(shè)計(jì)者準(zhǔn)備的輔助函數(shù)。這一點(diǎn)最容易通過與一種更常見的函數(shù)進(jìn)行類比來解釋,所以我們來做這個(gè)解釋。如果你有幾年的編程經(jīng)驗(yàn),你可能已經(jīng)見過類似于例3-19中的istify()函數(shù)的函數(shù)。示例 3-19中l(wèi)istify()的函數(shù)。

示例 3-19. 一個(gè)強(qiáng)制輸入列表的工具函數(shù)

這個(gè)函數(shù)試圖將參數(shù)轉(zhuǎn)換為一個(gè)列表,不管輸入的是什么。api和框架中經(jīng)常使用這類函數(shù)將輸入強(qiáng)制轉(zhuǎn)換為已知類型,這將簡化后續(xù)代碼——在本例中,您知道參數(shù)(來自listify()的輸出)將始終是一個(gè)列表。

如果我將listify()函數(shù)重命名為ensure_list(),那么您應(yīng)該開始看到與asyncio.ensure_future()的類似之處:它總是試圖將參數(shù)強(qiáng)制轉(zhuǎn)換為Future(或子類)類型。這是一個(gè)實(shí)用函數(shù),它使框架開發(fā)人員(而不是像你我這樣的終端用戶開發(fā)人員)的工作變得更容易。

實(shí)際上,asyncio標(biāo)準(zhǔn)庫模塊本身使用ensure_future()正是出于這個(gè)原因。當(dāng)你下次查看API時(shí),你會(huì)發(fā)現(xiàn)函數(shù)參數(shù)被描述為“可等待對象”,很可能內(nèi)部使用ensure_future()強(qiáng)制轉(zhuǎn)換參數(shù)。例如,asyncio.gather()函數(shù)就像下面的代碼一樣:

aws參數(shù)表示“可等待對象”,包括協(xié)程、task和future。在內(nèi)部,gather()使用ensure_future()進(jìn)行類型強(qiáng)制轉(zhuǎn)換:task和future保持不變,而把協(xié)程強(qiáng)制轉(zhuǎn)為task。

這里的關(guān)鍵是,作為終端用戶應(yīng)用程序開發(fā)人員,應(yīng)該永遠(yuǎn)不需要使用asyncio.ensure_future()。它更像是框架設(shè)計(jì)師的工具。如果你需要在事件循環(huán)上調(diào)度協(xié)程,只需直接使用asyncio.create_task()來完成。

在接下來的幾節(jié)中,我們將回到語言級別的特性,從異步上下文管理器開始。

Python-openpyxl教程11 - 注釋和樣式

注釋具有text屬性和author屬性,必須同時(shí)設(shè)置它們。

加載時(shí)工作薄中存在的注釋會(huì)自動(dòng)存儲在其相應(yīng)單元格的注釋屬性中。格式信息(如字體大小,粗體和斜體)以及注釋的容器框的原始尺寸和位置都將丟失。

保存工作薄時(shí)保留在工作薄中的注釋會(huì)自動(dòng)保存到工作薄文件中

注釋尺寸可以指定為只寫。評論尺寸以像素為單位。

如果需要, openpyxl.utils.units 包含用于從其他度量單位(例如mm或點(diǎn))轉(zhuǎn)換為像素的輔助函數(shù):

樣式用于屏幕上顯示時(shí)更改數(shù)據(jù)的外觀。他們還用于確定數(shù)字的格式。

樣式可以應(yīng)用于以下方面:

- 用于設(shè)置字體大小,顏色,下劃線等的字體

- 填充以設(shè)置圖案或顏色漸變

- border可以設(shè)置單元格的邊框

- 單元格對齊

- 保護(hù)

以下是默認(rèn)值:

有兩種類型的樣式:單元樣式和命名樣式,也成為樣式模板

單元格樣式在對象之間共享,并且一旦分配了它們就無法更改。這樣可以避免不必要的副作用,例如,僅更改一個(gè)單元格時(shí)就可以更改許多單元格的樣式。

樣式也可以復(fù)制

字體,背景,邊框等的顏色都可以通過三種方式設(shè)置:索引,aRGB或主題。 索引顏色是舊版實(shí)現(xiàn),顏色本身取決于工作薄或應(yīng)用程序默認(rèn)提供的索引。主題顏色可用于互補(bǔ)色,但也取決于工作薄中存在的主題,因此,建議使用RGB顏色。

RGB顏色使用紅色,綠色和藍(lán)色的十六進(jìn)制值設(shè)置

理論上,alpha值是指顏色的透明度,但這與單元格樣式無關(guān)。默認(rèn)值00將加在任何簡單的RGB值之前:

還支持傳統(tǒng)索引顏色以及主題和色彩。

索引64和65不能設(shè)置,并且分別留給系統(tǒng)前景色和背景色

樣式直接應(yīng)用于單元格

樣式也可以應(yīng)用于行和列,但是請注意,這僅適用于關(guān)閉文件后再Excel中創(chuàng)建的單元格。如果要將樣式應(yīng)用于整個(gè)行和列,則必須自己將樣式應(yīng)用于每個(gè)單元格。這是文件格式的限制:

合并的單元格的行為與其他單元格對象相似。其值和格式在其左上角的單元格中定義。為了更改整個(gè)合并單元格的邊框。請更改其左上角單元格的邊框。格式化是出于編寫目的而生成的。

與單元格樣式相反,命名樣式是可變的。當(dāng)您想一次將格式應(yīng)用于許多不同的單元格時(shí),它們很有意義。注意: 將命名樣式分配給單元格之后,對樣式的其他更改將不會(huì)影響該單元格。

一旦將命名樣式注冊到工作薄中,就可以簡單的通過名稱來引用它。

創(chuàng)建命名樣式后,可以將其注冊到工作薄中:

wb.add_name_style(highlight)

但是,命名樣式在首次分配給單元時(shí)也將自動(dòng)注冊:

ws['A1'].style = highlight

注冊后,僅使用名稱分配樣式:

ws['D5'].style = 'highlight'

該規(guī)范包括一些內(nèi)置樣式,也可以使用,不幸的是,這些樣式的名稱以本地化形式存儲。

openpyxl僅會(huì)識別英文名稱,并且只能與此處的文字完全一樣。如下:

Number formats

Informative

Text Styles

Comparisons

Highlights

區(qū)分 bytes str 和 unicode

Python3 有兩種表示字符序列的類型: bytes 和 str 。其中 bytes 是一種包含原始8位值的序列; str 是一種包含 Unicode 字符的序列。

Python2 也有兩種表示字符序列的類型: str 和 unicode 。其中 str 是一種包含原始8位值的序列; unicode 是一種包含 Unicode 字符的序列。

把 Unicode 字符轉(zhuǎn)換成二進(jìn)制數(shù)據(jù)(原始8位值)有多種辦法,最常見的編碼方式就是 UTF-8。Python3 的 str 實(shí)例或者 Python2 的 unicode 實(shí)例表示的 Unicode 字符要想轉(zhuǎn)換成二進(jìn)制數(shù)據(jù),必須使用 encode 方法;要想把二進(jìn)制數(shù)據(jù)轉(zhuǎn)換成 Unicode 字符,則必須使用 decode 方法。

編碼和解碼操作我們通常會(huì)放在最外圍來做,程序的核心部分應(yīng)該使用 Unicode 字符類型,即 Python3 中的 str 和 Python2 中的 unicode ,并且不要對字符編碼做任何假設(shè)。因此,在對輸入的數(shù)據(jù)進(jìn)行操作之前,我們通常會(huì)在應(yīng)用中定義好輔助函數(shù),以保證字符序列的類型符合以下預(yù)期:

下面,我們針對 Python2 和 Python3 ,分別編寫 2 個(gè)輔助函數(shù),以便在兩種情況之間轉(zhuǎn)換,確保轉(zhuǎn)換后的輸入數(shù)據(jù)符合預(yù)期的字符序列類型。

接受 str 或 bytes ,確保返回 str 的輔助函數(shù):

運(yùn)行結(jié)果:

接受 str 或 bytes ,確保返回 bytes 的輔助函數(shù):

運(yùn)行結(jié)果:

接受 str 或 unicode ,確保返回 unicode 的輔助函數(shù):

Python2 中的 str 在程序中均以原始的 8 位值表示:

下面的寫法,使用 format 函數(shù)連接 2 個(gè)字符序列,返回新的 str 是沒問題的:

可若要返回 unicode 字符序列,則會(huì)報(bào) UnicodeDecodeError :

這個(gè)時(shí)候我們就需要上述編寫的 to_unicode 輔助函數(shù),把 var2 轉(zhuǎn)變?yōu)? unicode 序列:

接受 str 或 unicode ,確保返回 str 的輔助函數(shù):

定義一個(gè) unicode 字符序列:

使用 format 函數(shù)連接 2 個(gè)字符序列,返回 unicode 字符序列:

同理,返回 str ,則會(huì)報(bào) UnicodeEncodeError :

我們需要借助上述編寫的輔助函數(shù) to_str 將 var3 轉(zhuǎn)換為字節(jié)序列:


網(wǎng)站欄目:python輔助函數(shù) Python輔助
瀏覽路徑:http://weahome.cn/article/doopjcs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部