- +1
Python3.10第二個alpha版本來了,最新特性值得關注
選自towardsdatascience
作者:James Briggs
機器之心編譯
編輯:陳萍
Python3.10 的第二個 alpha 版本已在 11 月初發布,相比于不久前發布的 3.9 版本,新版本對類型注釋擴展、zip、位計數、字典映射又有了新的改進。
Python3.9 剛剛發布不久,Python3.10 的第二個 alpha 版本也已于 11 月初發布。透過這個版本,我們或許可以一窺 Python 的未來改變。

類型注釋擴展
為什么類型注釋很重要
新方法和行為

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

類型注釋的延遲評估
類型注釋的評估始終在函數定義時執行,這意味著類型注釋以自上而下的方式逐行進行評估。這看似合乎邏輯,但存在兩個問題:
引用尚未定義的類型(前向引用)的類型提示無效,必須以字符串形式表示。例如應該是「“int”」而不是「int」(盡管這僅適用于自定義類型,而不是內置 / 預定義類型)。
由于需要執行類型提示,模塊導入的速度減慢。
因此,注釋將被存儲在 __annotations__,然后進行集中評估,即允許前向引用并首先執行模塊導入(以減少初始化時間)。
Union 操作符類型
Python 3.10 引入了 | 操作符。在注釋數據類型時,可以使用 | 作為 OR。例如,存在一個預計為 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 注釋
回到前向引用問題,避免前向引用的常見解決方案是將它們作為字符串寫入。
但是,將類型作為字符串編寫,會在將這些類型分配給變量時出現問題,因為 Python 假設字符串文本類型注釋只是一個字符串。
在使用類型注釋的地方使用該類型注釋變量將返回錯誤。例如:
MyType = "ClassName" # ClassName is our type annotationdef foo() -> MyType: ...
我們正在嘗試使用 MyType 作為類型的別名(alias),但是 MyType 將被讀取為字符串值,而不是類型別名。
只要在后面的代碼中定義了 ClassName,這就是有效的。目前,這將引發注釋錯誤。
為了解決這個問題,該版本添加了一個顯式地將 MyType 識別為類型別名的方法:
from typing_extensions import TypeAliasMyType: TypeAlias = "ClassName"def foo() -> MyType: ...ORMyType: TypeAlias = ClassName # if we have defined ClassName alreadydef foo() -> MyType: ...
為什么類型注釋很重要
Python 的強大之處在于它易于使用和掌握,原因之一就是我們不需要在整個代碼中顯式地定義類型。
這看似違背常理,但允許開發人員定義類型可以極大地增強代碼庫的可讀性和可維護性。例如從 transformers 庫的源代碼中提取如下內容:
def get_default_model(targeted_task: Dict, framework: Optional[str], task_options: Optional[Any]) -> str: ...
class DefaultArgumentHandler(ArgumentHandler): ... @staticmethod def handle_kwargs(kwargs: Dict) -> List: ...
@staticmethod def handle_args(args: Sequence[Any]) -> List[str]:
即使沒有上下文,我們也可以讀取這些代碼,并了解應該向這些函數、類和方法提供哪些數據,以及應該返回哪些數據類型。
在復雜的代碼庫(甚至是簡單的代碼庫)中,類型注釋可以極大地提高可讀性。同時,并不是每個開發者都想(或需要)使用類型注釋,因此可選的、無異常的功能可以達到完美的平衡。
新方法和實現
除了類型注釋方面的更改之外,3.10 alpha 2 版本對其他核心功能也進行了一些更新。
為 Zip 添加等長標記
第一個是 PEP 618,它為 zip() 函數添加了一個可選的 strict 標記。設置 strict = True,如果 zip 的兩個輸入長度不等,則會引發錯誤。

整數的位計數
也叫做「總體計數」(population count)。這一新方法允許計算整數二進制表示中 1 的個數,只需寫 int.bit_count() 即可:

三種字典方法 dict.keys()、dict.values() 和 dict.items() 返回字典的不同視圖。現在,將 mapping 屬性添加到每個視圖對象。

原文鏈接:
https://towardsdatascience.com/new-features-in-python-3-10-66ac05e62fc7
NeurIPS 2020線上分享:面向魯棒深度學習的對抗分布式訓練
論文:《Adversarial Distributional Training for Robust Deep Learning》。
本篇論文中,研究者提出了一種名為對抗分布式訓練(adversarial distributional training, ADT)的新型框架。11月26日,清華大學計算機系博士生董胤蓬,為大家詳細解讀此前沿研究。
識別二維碼,入群一起看直播。
? THE END
轉載請聯系本公眾號獲得授權
投稿或尋求報道:content@jiqizhixin.com喜歡此內容的人還喜歡
原標題:《Python3.10第二個alpha版本來了!最新特性值得關注》
本文為澎湃號作者或機構在澎湃新聞上傳并發布,僅代表該作者或機構觀點,不代表澎湃新聞的觀點或立場,澎湃新聞僅提供信息發布平臺。申請澎湃號請用電腦訪問http://renzheng.thepaper.cn。





- 報料熱線: 021-962866
- 報料郵箱: news@thepaper.cn
互聯網新聞信息服務許可證:31120170006
增值電信業務經營許可證:滬B2-2017116
? 2014-2025 上海東方報業有限公司