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)]
在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)]