Python 中省略号的用法?

2024年8月29日 | 阅读 8 分钟

省略号是英语文本中用于表示省略的标点符号。本质上,您会用三个点 (...) 来替换内容。然而,您可能在 Python 源代码中注意到过三个点。省略号不仅仅用于写作。

Python 中的省略号是省略号字面量 (...) 求值的结果。您可以在不导入的情况下使用 Ellipsis 或 ...,因为 Ellipsis 是一个内置常量。

简而言之:在 Python 中使用省略号作为占位符

虽然您可以在代码中使用 ... 和 Ellipsis,但 ... 更常用。您可以在 Python 中使用省略号来表示未编写的代码,就像英语中的三个点用于删除文本一样。

执行 ellipsis example.py 中的 do nothing() 不会导致 Python 报错。

调用一个函数体中只有 ... 的 Python 函数时,不会出现任何问题。就像 pass 关键字一样,这意味着您可以使用省略号作为占位符。

三个点产生的视觉干扰最小。因此,在网上分享代码片段时,更改不需要的代码可能很有用。

存根(Stubs)充当实际函数的替代。当您需要函数签名而不想执行函数体中的代码时,存根会很有用。例如,在创建应用程序时阻止外部请求。在使用存根时,您通常会省略代码。

假设您有一个带有自定义 stats.count visitor counter() 的 Flask 项目。跟踪访客统计数据的数据库连接到 count visitor() 方法。在调试模式下测试您的应用程序时,您可以创建 count visitor() 的存根,以避免自己被计数。

在这种情况下,函数体中省略号的使用是推荐的,因为 count visitor() 的内容无关紧要。当您在调试模式下运行 Flask 应用程序时,Python 会顺利运行 count visitor(),而不会出现问题或不良副作用。

如果以调试模式运行,Flask 应用程序第 14 行的 Count visitor() 会指向第 10 行的存根。在 count visitor() 方法体中使用...可以让你在没有负面影响的情况下测试你的应用程序。

如前所述,该示例展示了存根的较小规模用法。存根经常在大型项目的测试过程中使用,因为它们可以更容易地单独测试代码的特定部分。

此外,如果您熟悉 Python 中的类型检查,您可能会熟悉省略号与存根结合的讨论。

Mypy 是最常用于类型检查的程序。Mypy 使用存根文件来识别核心库和第三方库声明的类型。

访问 Python 的 type shed 存储库,以检查 ... 在该存储库的存根文件中是如何使用的。如果您更深入地研究静态类型主题,您可能会发现 Ellipsis 常量的其他应用。在下一节中,您将了解何时在类型提示中使用...。

类型提示中的省略号是什么意思?

在上一节中,您了解到可以使用省略号作为占位符来类型检查您的存根文件。然而,您也可以利用类型提示。您将在此领域了解如何使用...来

  1. 描述一个可变长度的同质类型元组。
  2. 更改可调用对象的参数列表以适应其他任何内容。

通过类型提示来清楚您期望的代码中的数据类型是一种明智的方法。但是,在某些情况下,使用类型提示比完全限制用户如何使用对象更可取。例如,您应该提供一个只包含整数的元组,但整数的确切数量由您决定。在这种情况下,省略号可能很有用。

说明:您在第 9 行定义了元组类型变量 numbers。numbers 变量需要是一个只包含整数的元组。总数是多少并不重要。

第 6、7、8 行的变量声明是正确的,因为它们符合类型提示。以下 numbers 的定义是被禁止的:

  • 第 11 行没有同质项。
  • 第 12 行是列表而不是元组。

如果您已安装 mypy,则可以运行代码来列出所有错误。

当您在元组中使用类型提示...时,它表示您期望元组的项是相同的。

另一方面,省略号字面量有效地消除了对可调用对象调用方式的限制,可能是在参数的数量或类型方面。

说明:您在第 12 行声明了可调用参数 action。可以向此可调用对象传递任意数量和类型的参数,但它必须始终返回一个整数。您还可以接受可变数量的可选参数,只要它们是整数,就可以使用 *args: int。在 calculate() 的函数体中的第 19 行,您调用了 action 可调用对象,并传递了一个数字 I 和任何其他参数。

当您构建一个可调用类型时,Python 需要知道您将接受什么类型的输入以及您期望可调用对象返回什么类型。您通过使用 Callable[..., int] 来表示您不关心可调用对象接受多少个或什么类型的参数。但是您说它必须返回一个整数。

compute() 的参数(第 16 和 17 行)是符合您设定的标准的函数。add_one() 和 multiply_with() 这两个可调用对象都返回一个整数。

第 20 行的代码无法执行,因为 nine 是不可调用的。就名称而言,可调用对象必须是您可以调用的东西。

由于 pixels() 是可调用的,因此在第 21 行使用它也是不正确的。您在第 10 行创建了一个 f-string。返回值是字符串而不是您期望的整数类型。

在上面的示例中,您已经探索了如何在类型提示中使用省略号占位符来表示元组和可调用对象。

类型

  • 元组:定义一个数据长度不确定且类型一致的元组。
  • 可调用:通过充当可调用对象的参数列表来消除限制。

NumPy 中用于切片的省略号

如果您之前使用过 NumPy,您可能已经看到过 Ellipsis 的另一种应用。使用 NumPy 中的省略号字面量,您可以对多个数组进行切片。

让我们从一个不使用 NumPy 中 Ellipsis 的示例开始。

在此 NumPy 示例中,您将组合 arange() 和 reshape() 这两个函数来生成一个三维数组。

如果您只想指定最后一个维度中的第一个元素,可以使用冒号 (:) 来切片 NumPy 数组。

说明:您必须提供三个切片,因为数组有三个维度;如果您添加了更多维度,请想象一下语法会变得多么令人厌烦!未能确定数组的维度会使情况变得更糟。

说明:在这种情况下,Arr 的元素有五个维度。您的结果可能会有所不同,因为维度数量是随机的。但是,使用...来指定您的多维数组将起作用。

NumPy 提供了更多使用 Ellipsis 来指示数组元素或范围的选项。有关这三个小点子的其他应用,请参阅 NumPy:ndarray 的 Ellipsis (...)。

Python 中的省略号总是三个点吗?

在了解了 Python 中的省略号之后,您可能会开始更仔细地注意 Python 世界中出现的每一个省略号。三个点可能出现在 Python 中,但它们可能不是 Ellipsis 常量。

Python 交互式 shell 中的三个点表示辅助提示。

例如,当您在 Python 程序中定义函数或编写 for 循环时,提示会跨越多行。

上面提到的示例中的三个点不是字面上的省略号;它们是函数体本身的辅助提示。

队列结束标记

省略号有时用于指示一行的结束。这是合乎逻辑的。

它足够独特,可以用作队列结束标记,即使它通常不是你在队列中看到的东西,所以你不需要构建自定义对象。

循环引用

在 REPL 中,Python 显示省略号表示循环引用。

这并不意味着 Python 用省略号替换了引用;它只是显示一个,而不是崩溃或溢出屏幕。您可以自己检查一下。如果您继续请求嵌套对象,原始的 a 仍然会被返回。

结论

字面量“ellipsis”(...) 求值为 Ellipsis 值。最常见的是,在创建函数存根时,您可能会使用...作为占位符。

在类型提示中使用三个点可能在您希望保持灵活性时很有用。省略号字面量可以替换可调用类型的参数列表,用可变长度的同质类型元组。

使用 NumPy,您可以通过用 Ellipsis 对象替换可变长度的维度来简化切片语法。由于三个点的无干扰语法,您的代码将更易于理解。