<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 第二個 alpha 版來了!最新特性值得關(guān)注

          共 3281字,需瀏覽 7分鐘

           ·

          2020-11-28 23:50

          ?△點擊上方Python貓”關(guān)注 ,回復(fù)“1”領(lǐng)取電子書

          作者:James Briggs,編譯:機器之心

          Python3.9 剛剛發(fā)布不久,Python3.10 的第二個 alpha 版本也已于 11 月初發(fā)布。透過這個版本,我們或許可以一窺 Python 的未來改變。



          Python3.10 第二個 alpha 版本的新功能包括以下三大部分:

          • 類型注釋擴展

          • 為什么類型注釋很重要

          • 新方法和行為



          類型注釋擴展

          Python3.9 版本對類型提示與注釋進行了徹底的修改和清理。Python3.10 版本似乎延續(xù)了這一趨勢,Python3.10 alpha 2 版本將類型注釋功能進行了擴展。

          從 Python 3.0 到 Python 3.10 類型注釋的變化。

          類型注釋的延遲評估

          類型注釋的評估始終在函數(shù)定義時執(zhí)行,這意味著類型注釋以自上而下的方式逐行進行評估。這看似合乎邏輯,但存在兩個問題:

          引用尚未定義的類型(前向引用)的類型提示無效,必須以字符串形式表示。例如應(yīng)該是「“int”」而不是「int」(盡管這僅適用于自定義類型,而不是內(nèi)置 / 預(yù)定義類型)。
          由于需要執(zhí)行類型提示,模塊導(dǎo)入的速度減慢。

          因此,注釋將被存儲在 __annotations__,然后進行集中評估,即允許前向引用并首先執(zhí)行模塊導(dǎo)入(以減少初始化時間)。

          Union 操作符類型

          Python 3.10 引入了 |? 操作符。在注釋數(shù)據(jù)類型時,可以使用 | 作為 OR。例如,存在一個預(yù)計為 int 或 float 的變量,我們可以將其寫作 int | float:
          def f(x: *int | float*) -> float:return x * 3.142
          f(1) # passf(1.5) # passf('str') # linter will show annotation error
          在 3.10 之前的版本中,等效運算符使用 type.Union 方法進行編寫,例如 Union[int, float]。

          TypeAlias 注釋

          回到前向引用問題,避免前向引用的常見解決方案是將它們作為字符串寫入。

          但是,將類型作為字符串編寫,會在將這些類型分配給變量時出現(xiàn)問題,因為 Python 假設(shè)字符串文本類型注釋只是一個字符串。

          在使用類型注釋的地方使用該類型注釋變量將返回錯誤。例如:
          MyType = "ClassName" # ClassName is our type annotationdef foo() -> MyType: ...
          我們正在嘗試使用 MyType 作為類型的別名(alias),但是 MyType 將被讀取為字符串值,而不是類型別名。

          只要在后面的代碼中定義了 ClassName,這就是有效的。目前,這將引發(fā)注釋錯誤。

          為了解決這個問題,該版本添加了一個顯式地將 MyType 識別為類型別名的方法:

          from typing_extensions import TypeAliasMyType: TypeAlias = "ClassName"def foo() -> MyType:    ...ORMyType: TypeAlias = ClassName # if we have defined ClassName alreadydef foo() -> MyType:    ...

          為什么類型注釋很重要

          Python 的強大之處在于它易于使用和掌握,原因之一就是我們不需要在整個代碼中顯式地定義類型。

          這看似違背常理,但允許開發(fā)人員定義類型可以極大地增強代碼庫的可讀性和可維護性。例如從 transformers 庫的源代碼中提取如下內(nèi)容:
          def get_default_model(targeted_task: Dict, framework: Optional[str], task_options: Optional[Any]) -> str:    ...
          class DefaultArgumentHandler(ArgumentHandler): ... @staticmethoddef handle_kwargs(kwargs: Dict) -> List: ...
          @staticmethoddef handle_args(args: Sequence[Any]) -> List[str]:
          即使沒有上下文,我們也可以讀取這些代碼,并了解應(yīng)該向這些函數(shù)、類和方法提供哪些數(shù)據(jù),以及應(yīng)該返回哪些數(shù)據(jù)類型。

          在復(fù)雜的代碼庫(甚至是簡單的代碼庫)中,類型注釋可以極大地提高可讀性。同時,并不是每個開發(fā)者都想(或需要)使用類型注釋,因此可選的、無異常的功能可以達到完美的平衡。

          新方法和實現(xiàn)

          除了類型注釋方面的更改之外,3.10 alpha 2 版本對其他核心功能也進行了一些更新。

          為 Zip 添加等長標(biāo)記

          第一個是 PEP 618,它為 zip() 函數(shù)添加了一個可選的 strict 標(biāo)記。設(shè)置 strict = True,如果 zip 的兩個輸入長度不等,則會引發(fā)錯誤。
          ## 例1x=[1,2,3,4,5,6]y=[1,2,3,4]z=zip(x,y)print(list(z))## [(1,1),(2,2),(3,3),(4,4)]
          ##?例2x=[1,2,3,4,5,6]y=[1,2,3,4]z=zip(x,y,strict=True)print(list(z))##?ValueError:?zip()?argument?2?is?shorter than argument 1
          例1無 strict=True 標(biāo)記,沒有引發(fā)錯誤,并且較長的列表被截斷用于創(chuàng)建壓縮生成器。例2設(shè)置 strict = True,就會引發(fā)錯誤。

          整數(shù)的位計數(shù)

          也叫做「總體計數(shù)」(population count)。這一新方法允許計算整數(shù)二進制表示中 1 的個數(shù),只需寫 int.bit_count() 即可:
          for?x?in[0,1,2,3,10,11,12,100,101,102]:  print(f"{x}={x.bit_count()}")##?0=0##?1=1## 2=1## 3=2## 10=2## 11=3...## 102=4
          字典視圖映射

          三種字典方法 dict.keys()、dict.values() 和 dict.items() 返回字典的不同視圖。現(xiàn)在,將 mapping 屬性添加到每個視圖對象。
          x={'hello':0,'world':1}keys=x.keys()print(keys)## dict_keys(['hello','world'])print(keys.mapping)## {'hello':0,'world':1}
          這一新屬性是 types.MappingProxyType 對象,用來包裝原始字典。如果在視圖上調(diào)用它,則返回原始字典。

          原文鏈接:
          https://towardsdatascience.com/new-features-in-python-3-10-66ac05e62fc7
          Python貓技術(shù)交流群開放啦!群里既有國內(nèi)一二線大廠在職員工,也有國內(nèi)外高校在讀學(xué)生,既有十多年碼齡的編程老鳥,也有中小學(xué)剛剛?cè)腴T的新人,學(xué)習(xí)氛圍良好!想入群的同學(xué),請在公號內(nèi)回復(fù)『交流群』,獲取貓哥的微信(謝絕廣告黨,非誠勿擾!)~

          近期熱門文章推薦:

          6 個例子教你重構(gòu) Python 代碼
          基于 Redis 配置異步 Celery
          如何用 Python 快速揭示數(shù)據(jù)之間的各種關(guān)系?
          不使用 if-elif 語句,如何優(yōu)雅地判斷某個數(shù)字所屬的等級?

          感謝創(chuàng)作者的好文
          瀏覽 71
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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>
                  日日撸夜夜艹 | 91久久久久久久久久久 | 蜜芽在线无码AV | 无码一区二区免费三区在线 | 永久在线一区二区三区 |