簡體   English   中英

Python中如何創建用戶自定義類型斷言?

[英]How to create a user-defined type assertion in Python?

如何創建一個 function 以類似於isinstance的方式縮小變量的類型(對於 static 類型檢查器)?

例如, ComplexTypeAssertion只是在運行時縮小了類型的范圍,而不是用於 static 檢查:

def MyFunction(myData: object) -> object:
  if isinstance(myData, list):
    reveal_type(myData)  # Revealed type is 'builtins.list[Any]'
  if ComplexTypeAssertion(myData):   # <<< How to make MyPy understand this?
    reveal_type(myData)  # Revealed type is 'builtins.object'

def ComplexTypeAssertion(data: object) -> bool:
    return isinstance(data, list) and all(isinstance(value, str) for value in data)

我如何定義ComplexTypeAssertion以便 static 分析工具能夠理解該類型?

顯然,這是一個玩具示例,現實生活中的示例會更復雜。 在我想斷言某些數據遵循TypedDict構造或其他類型構造的情況下,這將非常有用。

Mypy 通常只理解縮小類型的幾種特定方法,例如使用isinstanceif x is not None 但是,在 Python >=3.10 中, PEP 647使用新的typing.TypeGuard功能提供了解決此問題的方法。 現在,您可以像這樣編寫您的ComplexTypeAssertion function,並且類型檢查器將理解如果 function 返回True ,則data保證為list[str]類型:

from typing import TypeGuard

def ComplexTypeAssertion(data: object) -> TypeGuard[list[str]]:
    return isinstance(data, list) and all(isinstance(value, str) for value in data)

TypeGuard也可用於 Python <3.10,通過PyPI 上的半官方typing-extensions,它為早期版本的 Python 提供了較新類型結構的向后移植。(如果您使用的是 Mypy,您會發現typing-extensions是已經是 Mypy 的依賴項,因此從typing-extensions導入某些內容甚至不一定意味着您必須向項目添加額外的依賴項。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM