Python 3:函数参数中的省略号?

Bor*_*kov 6 python-3.x aiohttp

我最近遇到了Ellipsis(...),它在aiohttp代码中的函数参数中使用,然后在该函数的主体中使用:

def make_mocked_request(method, path, headers=None, *,
                        match_info=sentinel,
                        version=HttpVersion(1, 1), closing=False,
                        app=None,
                        writer=sentinel,
                        protocol=sentinel,
                        transport=sentinel,
                        payload=sentinel,
                        sslcontext=None,
                        client_max_size=1024**2,
                        loop=...):
    """Creates mocked web.Request testing purposes.

    Useful in unit tests, when spinning full web server is overkill or
    specific conditions and errors are hard to trigger.

    """

    task = mock.Mock()
    if loop is ...:
        loop = mock.Mock()
        loop.create_future.return_value = ()

Run Code Online (Sandbox Code Playgroud)

您能解释这个新的python 3功能吗?

wim*_*wim 8

Ellipsis是Python中的内置常量。在Python 3中,它具有文字语法,...因此可以像其他任何文字一样使用。Guido为Python 3 接受了这种方法,因为有些人认为它很可爱

您找到的代码(用作默认的函数参数)显然是一种这样的“可爱”用法。在该代码的后面,您将看到:

if loop is ...:
    loop = mock.Mock()
    loop.create_future.return_value = ()
Run Code Online (Sandbox Code Playgroud)

在这里,它仅用作哨兵,也可能是object()或其他任何东西-没有特定于的东西EllipsisNone在这种情况下,也许普通的哨兵在其他情况下还有其他一些特定的含义,尽管我在提交中看不到任何证据(似乎None也能奏效)。

有时在野外经常看到的省略号文字的另一个用例是占位符,用于尚未编写的代码,类似于pass语句:

class Todo:
    ...
Run Code Online (Sandbox Code Playgroud)

有关涉及扩展切片语法的更典型的用例,请参见Python Ellipsis对象做什么?

  • 感谢回复,@wim!所以我假设这里使用省略号是一种“可爱”的方式来检查参数没有传递到这个函数的输入(因此等于它的默认值,即省略号)。 (2认同)

Bra*_*cky 6

基于/sf/answers/3808425911/构建,在处理类型注释时使用...vs具有一定的有效性。None考虑以下:

def foo(map: dict = None):
    if not map:
        map = {}

    return map
Run Code Online (Sandbox Code Playgroud)

当然,这并没有多大作用,但这会导致类型提示在现代编辑器(例如 VS Code)中发生冲突。这是因为您声称它map是 adict但默认值是 a NoneType(不是 a dict)。

省略号是它自己的类型,因此 VS Code 不会抱怨,但您可以以类似的方式与它交互,因为它是一个哨兵值。

def food(map: dict = ...):
    if map is ...:
        map = {}

    return map
Run Code Online (Sandbox Code Playgroud)

VS Code 不会对类型提示以及该变量在运行代码过程中可能变成的各种类型产生任何担忧。

我不能肯定地说为什么aiohttp代码使用它,因为它们似乎没有使用类型注释,但这至少是这样做的一个可行的理由。