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

时间:2019-01-28 16:03:56

标签: python-3.x aiohttp

我最近遇到了椭圆(...),该椭圆在aiohttp code中的函数参数中使用,然后在该函数的主体中使用:

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 = ()

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

1 个答案:

答案 0 :(得分:6)

Ellipsis是Python中的内置常量。在Python 3中,它具有文字语法...,因此可以像其他任何文字一样使用。 Guido被Python 3接受,因为some folks thought it would be cute

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

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

在这里,它只是用作哨兵,也可能是object()或其他任何东西-Ellipsis没有特定的内容。也许通常的哨兵None在此情况下还有其他一些特定含义,尽管我在the commit中看不到任何证据(看来None也会一样有效)。

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

class Todo:
    ...

有关涉及扩展切片语法的更典型的用例,请参见What does the Python Ellipsis object do?