类型提示变量以与Python中的另一个变量具有相同的类型

时间:2019-02-10 09:39:59

标签: python python-typing

示例:

def f(...): ...
v: type(f) = decorate(f)

但是VSCode的Python语言服务器似乎无法识别它(而MyPy给它提供了object类型?)。

部分问题是decorate未被手动键入并且被错误推断。

1 个答案:

答案 0 :(得分:2)

类型表达式由类型检查器静态评估。*诸如type(f)之类的复杂表达式无法保证正常工作,因为type(f)的计算结果为{{ 1}},而不是其静态注释值。**类型检查器不知道该运行时类型将是什么。通常,您应遵循PEP 484中所述的类型表达式,以实现最大的兼容性。

  

部分问题是f未被手动键入并且被错误推断。

因此修复它。例如,您可以说它返回与其参数类型相同的对象:

decorate

*类型表达式也将在运行时求值,存储在T = typing.TypeVar('T') d = typing.cast(decorate, typing.Callable[[T], T]) v = d(f) # v is inferred to have the same type as f 字段中,然后除非在某些代码决定对其进行自省之前,否则将不再使用。此运行时功能很少使用,并且与问题无关。
**实际上,这还比那更糟,因为有人可能用自定义__annotations__用猴子修补了您的模块,该自定义功能与内置功能完全不同。