Python 函数工具提示的所有句法元素是什么?

What are all the syntactic elements of a Python function tooltip?

在VS Code中指向sorted,出现如下弹窗:

这包含很多我从 Python 不知道的语法元素,例如 /*_T@;来自 C++,看起来 SupportsRichComparison 类似于 C++20 概念 但它到底是什么?

此外,如何区分这两种不同的重载的用途?

这有点像火车失事。归结为:

  • 如果你只传递一个迭代给sorted(这样关键字参数key得到它的默认值None),那么必须有一个比较元素以确定排序的方法。

  • 如果你 do 提供一个 key 参数,那么你可以有一个任意的可迭代对象,因为 key 的值将用于将值“映射”到可以进行比较的事物。

可以通过位置参数或关键字参数指定常规参数。

/ 之前的参数仅限于位置:您不能使用关键字参数为它们指定值。 (sorted(__iterable=[1,2,3]) 是非法的。)

* 之后的参数仅限关键字:您可以 使用关键字参数为它们指定值。 (sorted([1,2,3], f) 是非法的。)

_T 是一个类型变量:它表示一个特定但未知的类型,主要用于将 __iterable 的类型提示与 key.[=38 的类型提示联系起来=]

SupportsRichComparison 看起来是一个 typing.Protocol,这意味着它基本上是一个抽象基础 class,断言它的子 class 为 [=27= 提供定义]等。请注意,__iterable 的元素要么是 SupportsRichComparison 的实例,要么是某些 class _T 的实例,key 知道如何转换为 SupportsRichComparison.

我不知道如何解释@。它不符合我所知道的任何实际 Python 语法;它 可能 只是某种常规分隔符,用于从其他一些信息构建类型变量。


作为一个具体的例子,考虑复数。两个复数不能直接比较:

>>> sorted([3+4j, 6-7j])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'complex' and 'complex'

但整数是可比较的:

>>> sorted([4, -7])
[-7, 4]

因此,如果您有一些函数可以将 3 + 4j 映射到 4 并将 6-7j 映射到 -7,您可以对原始复数列表进行排序。

>>> sorted([3+4j, 6-7j], key=lambda x: x.imag)
[(6-7j), (3+4j)]