`type` 可调用对象如何在 PyCharm 中显示两个重载签名?
How does the `type` callable show two overloaded signatures in PyCharm?
Python中的type
可调用函数有两种使用方式;对于一个参数,它 returns 参数的 class,对于三个参数,它 returns 一个新的 class.
在 PyCharm 中,type
可调用代码的完成使得 type
看起来超载,通过提供调用 type
的第一个和第二个选项:
PyCharm如何显示如上图所示的两种调用type
的方式?
这是否也可以通过我们自己的用户定义的可调用对象来完成,或者这是 PyCharm 硬编码 type
的特例?
在 PyCharm 中,如果我双击 type
,我将被发送到 builtins.py
中 type
的 __init__
定义。然而,这显示了一些不同的东西:
这表明 Pycharm 没有检查文档字符串或任何花哨的东西。
此外,此定义不包含任何类型提示,但 pycharm 代码完成显示两种调用方式的类型提示 type
。它怎么知道要这样做?
PyCharm 使用 Typeshed package to get the annotations and definitions for the Python standard library as described here. This package contains stub files (.pyi
files) that provide the annotations. Specifically, the type
stub can be found here:
@overload
def __init__(self, __o: object) -> None: ...
@overload
def __init__(self, __name: str, __bases: tuple[type, ...], __dict: dict[str, Any], **kwds: Any) -> None: ...
要使用多个不同的签名来注释函数,您可以使用 typing.overload
decorator to provide multiple annotations for the same function, example below. This is how Typeshed provides two different definitions for the type function
@overload
def foo(bar: int) -> int:
...
@overload
def foo(bar: str) -> str:
...
def foo(bar):
# func body
Python中的type
可调用函数有两种使用方式;对于一个参数,它 returns 参数的 class,对于三个参数,它 returns 一个新的 class.
在 PyCharm 中,type
可调用代码的完成使得 type
看起来超载,通过提供调用 type
的第一个和第二个选项:
PyCharm如何显示如上图所示的两种调用type
的方式?
这是否也可以通过我们自己的用户定义的可调用对象来完成,或者这是 PyCharm 硬编码 type
的特例?
在 PyCharm 中,如果我双击 type
,我将被发送到 builtins.py
中 type
的 __init__
定义。然而,这显示了一些不同的东西:
这表明 Pycharm 没有检查文档字符串或任何花哨的东西。
此外,此定义不包含任何类型提示,但 pycharm 代码完成显示两种调用方式的类型提示 type
。它怎么知道要这样做?
PyCharm 使用 Typeshed package to get the annotations and definitions for the Python standard library as described here. This package contains stub files (.pyi
files) that provide the annotations. Specifically, the type
stub can be found here:
@overload
def __init__(self, __o: object) -> None: ...
@overload
def __init__(self, __name: str, __bases: tuple[type, ...], __dict: dict[str, Any], **kwds: Any) -> None: ...
要使用多个不同的签名来注释函数,您可以使用 typing.overload
decorator to provide multiple annotations for the same function, example below. This is how Typeshed provides two different definitions for the type function
@overload
def foo(bar: int) -> int:
...
@overload
def foo(bar: str) -> str:
...
def foo(bar):
# func body