如何创建一个函数,以类似于isinstance
的方式缩小变量的类型(对于静态类型检查器)
例如,ComplexTypeAssertion
只是在运行时缩小类型范围,但不用于静态检查:
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
以便静态分析工具能够理解该类型
显然,这是一个玩具的例子,现实生活中的例子会更复杂。在我想断言某些数据遵循TypedDict
构造或其他类型构造的情况下,这将非常有用
Mypy通常只理解几种缩小类型的特定方法,例如使用
isinstance
或if x is not None
。然而,在Python中>=3.10,PEP 647使用新的typing.TypeGuard
功能提供了此问题的解决方案。现在,您可以像这样编写ComplexTypeAssertion
函数,并且类型检查器将了解data
保证为list[str]
类型,如果函数返回True
:TypeGuard
也可用于Python<;3.10通过半官方的^{typing-extensions
已经是Mypy的依赖项,因此从typing-extensions
导入某些内容甚至不一定意味着您必须向项目添加额外的依赖项。)相关问题 更多 >
编程相关推荐