<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python 3.10 的一些新特性

          共 3238字,需瀏覽 7分鐘

           ·

          2020-11-19 21:38

          Python 3.10.0a2 版本已經(jīng)于 2020-11-04 發(fā)布,因此我們可以窺見(jiàn) Python 3.10 的一些新特性。這些新特性很可能會(huì)改變未來(lái)的 Python 生態(tài)系統(tǒng),使其朝著更明確,更易讀的方向發(fā)展,同時(shí)保持我們熟知和喜歡的易用性。

          由于采用了新的發(fā)行計(jì)劃:PEP 602 -- Annual Release Cycle for Python,我們可以看到更短的開(kāi)發(fā)窗口,我們有望在 2021 年 10 月使用今天分享的這些新特性。

          PEP 602

          1、類(lèi)型注釋的進(jìn)一步擴(kuò)展

          3.9 版對(duì) Python 中的類(lèi)型提示和注釋進(jìn)行了大幅度修改和清理,類(lèi)型提示這似乎是一種持續(xù)的趨勢(shì),在 3.10 中得到進(jìn)一步擴(kuò)展,目的很明顯,是為了更好的可讀性,無(wú)需看代碼即可得知變量和函數(shù)返回值的類(lèi)型。

          延遲類(lèi)型注釋的執(zhí)行

          類(lèi)型注釋的運(yùn)行通常被認(rèn)為是在函數(shù)定義時(shí)執(zhí)行,這意味著類(lèi)型注釋以自上而下的方式逐行進(jìn)行檢查。

          盡管看起來(lái)合乎邏輯,但是這樣做有兩個(gè)問(wèn)題:

          1、引用尚未定義的類(lèi)型的類(lèi)型提示(前向引用)將不起作用,必須以字符串形式表示。也就是說(shuō):假如 int 是自定義類(lèi)型,我們需要編寫(xiě) "int" 而不是編寫(xiě) int 。

          2、這會(huì)減慢模塊導(dǎo)入的速度,因?yàn)榇藭r(shí)會(huì)執(zhí)行類(lèi)型提示。

          因此,取而代之的是延遲類(lèi)型注釋,將類(lèi)型注釋將以字符串形式存儲(chǔ)在__annotations__中,如果需要這些類(lèi)型注釋可以在運(yùn)行時(shí)通過(guò) typing.get_type_hints() 來(lái)解析,也可以通過(guò)inspect.signature() 來(lái)立即進(jìn)行解析,這樣的好處是可以先執(zhí)行模塊導(dǎo)入,允許前向引用,從而減少初始化時(shí)間。

          新增類(lèi)型注釋聯(lián)合操作符

          3.10 通過(guò) "|" 作為邏輯或操作符。在注釋數(shù)據(jù)類(lèi)型時(shí),我們可以使用 | 作為或。例如,我們有一個(gè)預(yù)期為 int 或 float 的變量,可以寫(xiě)為 int | float ,如下所示:

          def?f(x:?int?|?float)?->?float:
          ????return?x?*?3.142
          f(1)??#?pass
          f(1.5)??#?pass
          f('str')??#?linter?will?show?annotation?error

          也可以使用 typing 模塊提供的關(guān)鍵字 Union,比如 Union[int, float]

          TypeAlias 注釋

          回到前向引用問(wèn)題,避免前向引用的常見(jiàn)解決方案是將它們編寫(xiě)為字符串。

          但是,將類(lèi)型寫(xiě)為字符串會(huì)在將這些類(lèi)型分配給變量時(shí)引起問(wèn)題,因?yàn)?Python 會(huì)假定我們的字符串文字類(lèi)型注釋只是一個(gè)字符串。

          在通常使用類(lèi)型注釋的地方使用該類(lèi)型注釋變量將返回錯(cuò)誤。例如:

          MyType?=?"ClassName"??#?ClassName?is?our?type?annotation
          def?foo()?->?MyType:
          ????...

          在這里,我們?cè)噲D將其 MyType 用作類(lèi)型的別名 ,但是, MyType 它將被讀取為字符串值,而不是類(lèi)型別名。只要 ClassName 在代碼的后面定義,這就是有效的。當(dāng)前情況下,這將引發(fā)注釋錯(cuò)誤。

          為了解決這個(gè)問(wèn)題,添加了一種顯式標(biāo)識(shí) MyType 為類(lèi)型別名的方法 :

          from?typing_extensions?import?TypeAlias
          MyType:?TypeAlias?=?"ClassName"
          def?foo()?->?MyType:
          ????...
          OR
          MyType:?TypeAlias?=?ClassName?#?if?we?have?defined?ClassName?already
          def?foo()?->?MyType:
          ????...

          這里說(shuō)下,為什么類(lèi)型很重要,盡管這當(dāng)然不是一個(gè)巨大的變動(dòng),但是看到 Python 開(kāi)發(fā)人員加倍努力以增強(qiáng)類(lèi)型功能,這真是太酷了。Python 的優(yōu)勢(shì)在于其易用性和缺乏陡峭的學(xué)習(xí)曲線。原因之一是不需要在我們的代碼中顯式定義類(lèi)型。

          增強(qiáng)類(lèi)型注釋看起來(lái)似乎違反直覺(jué),但是為開(kāi)發(fā)人員 提供定義類(lèi)型的選項(xiàng) 可以極大地提高代碼庫(kù)的可讀性和可維護(hù)性。例如,從 Python transformers 庫(kù)的源代碼中可以看到以下說(shuō)明:

          Even without context, we can read this code and immediately grasp what data we should expect to be fed into these functions, classes, and methods — and exactly which datatypes we should be expecting to return.

          In complex code bases (and even simple ones), type annotation can massively improve readability. Simultaneously, not everyone will want (or need) to use them — so an optional, exception-free functionality strikes a perfect balance.

          意思是即使沒(méi)有上下文,我們也可以閱讀此代碼,并立即掌握應(yīng)將哪些數(shù)據(jù)期望輸入到這些函數(shù),類(lèi)和方法中,以及確切地期望返回哪些數(shù)據(jù)類(lèi)型。

          但在復(fù)雜的代碼庫(kù)(甚至簡(jiǎn)單的代碼庫(kù))中,類(lèi)型注釋可以大大提高可讀性。同時(shí),并不是每個(gè)人都希望(或需要)使用它們,因此,這是可選的。這種無(wú)異常的功能可以達(dá)到完美的平衡。

          這些改進(jìn)表明 Python 對(duì)類(lèi)型注釋功能的承諾,基于此,我們最喜歡的庫(kù)和我們自己寫(xiě)的代碼可以大大提示可閱讀性,這會(huì)對(duì) Python 生態(tài)系統(tǒng)產(chǎn)生長(zhǎng)期的正面影響。

          2、新增的函數(shù)及函數(shù)參數(shù)的變化

          除了類(lèi)型提示功能的擴(kuò)展外,核心 Python 功能進(jìn)行了一些更新,如下。

          函數(shù) zip() 增加 strict 參數(shù)

          函數(shù) zip() 增加 strict 參數(shù),如果設(shè)置 strict = True,而傳輸?shù)膮?shù)的長(zhǎng)度不相等將會(huì)拋出異常,如下圖所示:

          新的 strict 參數(shù)不是盲目地截?cái)嗖黄ヅ涞臄?shù)據(jù),而是使我們能夠控制它的行為,這將使很多開(kāi)發(fā)人員免于遭受麻煩。

          新增整數(shù)的位計(jì)數(shù)器 int.bit_count()

          此新方法使我們能夠計(jì)算整數(shù)的二進(jìn)制表示形式中 1 的個(gè)數(shù),在某些場(chǎng)景下這個(gè)函數(shù)非常實(shí)用且高效。

          上圖中的結(jié)果即為整數(shù)以二進(jìn)制位為 1 的個(gè)數(shù):

          0???=?00000000
          1???=?00000001
          2???=?00000010
          3???=?00000011
          10??=?00001010
          11??=?00001011
          12??=?00001100
          100?=?01100100
          101?=?01100101
          102?=?01100110

          字典的視圖增加一個(gè)屬性

          字典類(lèi)型的 3 個(gè)方法:dict.items()、dict.keys()、dict.values() 分別返回字典的 3 個(gè)視圖,現(xiàn)在每個(gè)視圖都增加來(lái)一個(gè)屬性,叫 mapping,具體用法如下:

          新的屬性 mapping 的類(lèi)型屬于 types.MappingProxyType,是圍繞原字典的一個(gè)屬性,在任何視圖上訪問(wèn) mapping 屬性,都將返回原字典。

          現(xiàn)在就這些了,盡管我們距離 3.10 的開(kāi)發(fā)時(shí)間表只有幾個(gè)月的時(shí)間,但已經(jīng)有很多有趣的更改,Python 的發(fā)展仍在繼續(xù),似乎還會(huì)為語(yǔ)言添加更多有趣的功能。

          希望您喜歡這篇文章,請(qǐng)點(diǎn)贊、轉(zhuǎn)發(fā)、關(guān)注,謝謝支持。

          瀏覽 91
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久AV影院| 日韩操逼视屏 | 91视频大香蕉 | 东京热视频专区 | 伊人大香蕉视频网 |