示例:
def f(...): ...
v: type(f) = decorate(f)
但是VSCode的Python语言服务器似乎无法识别它(而MyPy给它提供了object
类型?)。
部分问题是decorate
未被手动键入并且被错误推断。
答案 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__
用猴子修补了您的模块,该自定义功能与内置功能完全不同。