类型提示变量与 Python 中的另一个变量具有相同的类型
Type-hinting a variable to have the same type as another variable in Python
示例:
def f(...): ...
v: type(f) = decorate(f)
但是 VSCode 的 Python 语言服务器似乎无法识别它(MyPy 给它提供了 object
类型?)。
这里的部分问题是 decorate
不是手动输入的,并且推断不正确。
类型表达式由类型检查器静态评估。*复杂的表达式如 type(f)
不能保证有效,因为 type(f)
评估为 runtime f
的类型,而不是其静态注释值。** 类型检查器不知道该运行时类型是什么。通常,您应该坚持使用 PEP 484 中描述的类型表达式以获得最大兼容性。
Part of the problem here is that decorate
is not manually typed and is improperly inferred.
所以修复它。例如,您可以说它 returns 是与其参数类型相同的对象:
T = typing.TypeVar('T')
d = typing.cast(typing.Callable[[T], T], decorate)
v = d(f) # v is inferred to have the same type as f
* 类型表达式也在运行时进行评估,存储在 __annotations__
字段中,然后不再使用,除非某些代码决定对它们进行内省。此运行时功能很少使用且与问题无关。
** 事实上,它比那更糟,因为有人可能用自定义 type()
猴子修补了你的模块,它做了一些与内置完全不同的事情。
示例:
def f(...): ...
v: type(f) = decorate(f)
但是 VSCode 的 Python 语言服务器似乎无法识别它(MyPy 给它提供了 object
类型?)。
这里的部分问题是 decorate
不是手动输入的,并且推断不正确。
类型表达式由类型检查器静态评估。*复杂的表达式如 type(f)
不能保证有效,因为 type(f)
评估为 runtime f
的类型,而不是其静态注释值。** 类型检查器不知道该运行时类型是什么。通常,您应该坚持使用 PEP 484 中描述的类型表达式以获得最大兼容性。
Part of the problem here is that
decorate
is not manually typed and is improperly inferred.
所以修复它。例如,您可以说它 returns 是与其参数类型相同的对象:
T = typing.TypeVar('T')
d = typing.cast(typing.Callable[[T], T], decorate)
v = d(f) # v is inferred to have the same type as f
* 类型表达式也在运行时进行评估,存储在 __annotations__
字段中,然后不再使用,除非某些代码决定对它们进行内省。此运行时功能很少使用且与问题无关。
** 事实上,它比那更糟,因为有人可能用自定义 type()
猴子修补了你的模块,它做了一些与内置完全不同的事情。