2024-06-09 20:00:26 发布
网友
示例:
def f(...): ... v: type(f) = decorate(f)
但是VSCode的Python语言服务器似乎无法识别它(MyPy给了它object类型?)。你知道吗
object
这里的部分问题是decorate不是手动键入的,并且推断不正确。你知道吗
decorate
类型表达式由类型检查器静态计算。*像type(f)这样的复杂表达式不能保证工作,因为type(f)的计算结果是f的运行时类型,而不是它的静态注释值。**类型检查器不知道该运行时类型是什么。一般来说,您应该坚持使用PEP 484中描述的类型表达式以获得最大的兼容性。你知道吗
type(f)
f
Part of the problem here is that decorate is not manually typed and is improperly inferred.
那就修好它。例如,您可以说它返回的对象与其参数的类型相同:
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()修补了您的模块,它的功能与内置的完全不同。你知道吗
__annotations__
type()
类型表达式由类型检查器静态计算。*像
type(f)
这样的复杂表达式不能保证工作,因为type(f)
的计算结果是f
的运行时类型,而不是它的静态注释值。**类型检查器不知道该运行时类型是什么。一般来说,您应该坚持使用PEP 484中描述的类型表达式以获得最大的兼容性。你知道吗那就修好它。例如,您可以说它返回的对象与其参数的类型相同:
*类型表达式也会在运行时进行计算,存储在
__annotations__
字段中,然后再也不会使用,除非某些代码决定对它们进行内省。此运行时功能很少使用,与问题无关。**事实上,这比这更糟糕,因为有人可能用一个定制的
type()
修补了您的模块,它的功能与内置的完全不同。你知道吗相关问题 更多 >
编程相关推荐