`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.pytype__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