![](/img/trans.png)
[英]Python - How to create a user-defined function to convert an integer into a float-type number?
[英]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 通常只理解縮小類型的幾種特定方法,例如使用isinstance
或if 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.