Ellipsis 对象有什么作用?

2024-11-27 10:43:00
admin
原创
150
摘要:问题描述:在随意浏览命名空间时,我注意到一个看起来很奇怪的对象Ellipsis,它似乎没有做任何特殊的事情,但它是一个全局可用的内置函数。经过搜索,我发现它在 Numpy 和 Scipy 的切片语法的一些模糊变体中使用......但几乎没有其他用途。这个对象是否专门添加到语言中以支持 Numpy + Scip...

问题描述:

在随意浏览命名空间时,我注意到一个看起来很奇怪的对象Ellipsis,它似乎没有做任何特殊的事情,但它是一个全局可用的内置函数。

经过搜索,我发现它在 Numpy 和 Scipy 的切片语法的一些模糊变体中使用......但几乎没有其他用途。

这个对象是否专门添加到语言中以支持 Numpy + Scipy?省略号是否有任何通用含义或用途?

D:workspace
umpy>python
Python 2.4.4 (#71, Oct 18 2006, 08:34:43) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> Ellipsis
Ellipsis

解决方案 1:

最近在另一个问题中提到了这个问题。我将从那里详细阐述我的答案:

省略号是可以出现在切片符号中的对象。例如:

myList[1:2, ..., 0]

它的解释完全取决于实现该__getitem__函数并Ellipsis在其中看到对象的内容,但它的主要(和预期)用途是在numpy第三方库中,该库添加了多维数组类型。由于存在多个维度,因此切片变得比仅使用起始和终止索引更复杂;能够在多个维度上切片也很有用。例如,给定一个 4 × 4 数组,左上角区域将由切片定义[:2, :2]

>>> a
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12],
       [13, 14, 15, 16]])

>>> a[:2, :2]  # top left
array([[1, 2],
       [5, 6]])

进一步扩展,省略号在这里用于表示未指定的其余数组维度的占位符。可以将其视为表示[:]其所在间隙中所有维度的完整切片,因此对于 3d 数组,a[..., 0]与 相同;a[:, :, 0]对于 4d数组a[:, :, :, 0],类似地,a[0, ..., 0]与 相同a[0, :, :, 0](无论中间有多少个冒号构成数组中的全部维度数)。

有趣的是,在 python3 中,省略号文字 ( ...) 在切片语法之外可用,因此您实际上可以写:

>>> ...
Ellipsis

编辑:省略号也用于标准库typing模块:例如Callable[..., int],表示返回int不指定签名的可调用函数,或Tuple[str, ...]表示可变长度的同构字符串元组。

解决方案 2:

在 Python 3 中,你可以¹使用省略号文字...作为尚未编写的代码的“nop”占位符:

def will_do_something():
    ...

不是魔术;可以使用任何表达式来代替...,例如:

def will_do_something():
    1

(不能使用“批准”这个词,但我可以说这种用法并没有被 Guido断然拒绝。)

¹'can' not in {'must', 'should'}

解决方案 3:

从 Python 3.5 和PEP484开始,在使用typing模块时,文字省略号用于向静态类型检查器表示某些类型。

示例 1:

任意长度的同构元组可以用一种类型和省略号来表示,例如Tuple[int, ...]

示例 2:

可以通过用文字省略号(三个点)替换参数列表来声明可调用函数的返回类型,而无需指定调用签名:

def partial(func: Callable[..., str], *args) -> Callable[..., str]:
    # Body

解决方案 4:

总结其他人所说的,从 Python 3 开始,省略号本质上是另一个类似于的单例常量None,但没有特定的预期用途。现有的用途包括:

  • 在切片语法中表示剩余维度中的完整切片

  • 在类型提示中仅指示部分类型(Callable[..., int]Tuple[str, ...]

  • 在类型存根文件中指示存在默认值而无需指定它

可能的用途包括:

  • None作为有效选项的默认值

  • 作为尚未实现的功能的内容

解决方案 5:

您还可以在指定预期的doctest输出时使用省略号:

class MyClass(object):
    """Example of a doctest Ellipsis

    >>> thing = MyClass()
    >>> # Match <class '__main__.MyClass'> and <class '%(module).MyClass'>
    >>> type(thing)           # doctest:+ELLIPSIS
    <class '....MyClass'>
    """
    pass

解决方案 6:

来自Python 文档:

此对象通常用于切片(请参阅切片)。它不支持任何特殊操作。只有一个省略号对象,名为 Ellipsis(内置名称)。type(Ellipsis)()生成 Ellipsis 单例。

它写为Ellipsis...

解决方案 7:

对于在大量使用 Pydantic 的代码库中工作过的人来说:这也是 Pydantic 指示必填字段但可以设置为 的方式None,他们将其称为“必填可选字段”。这就是为什么它们最终也在 FastAPI 中使用。

解决方案 8:

__getitem__`...`自定义类中的最小示例

当魔法语法...传递到[]自定义类时,__getitem__()会接收一个Ellipsis类对象。

然后该类就可以用这个 Singleton 对象做任何它想做的事情。

例子:

class C(object):
    def __getitem__(self, k):
        return k

# Single argument is passed directly.
assert C()[0] == 0

# Multiple indices generate a tuple.
assert C()[0, 1] == (0, 1)

# Slice notation generates a slice object.
assert C()[1:2:3] == slice(1, 2, 3)

# Empty slice entries become None.
assert C()[:2:] == slice(None, 2, None)

# Ellipsis notation generates the Ellipsis class object.
# Ellipsis is a singleton, so we can compare with `is`.
assert C()[...] is Ellipsis

# Everything mixed up.
assert C()[1, 2:3:4, ..., 6, :7:, ..., 8] == \n       (1, slice(2,3,4), Ellipsis, 6, slice(None,7,None), Ellipsis, 8)

Python 内置list类选择赋予它范围的语义,并且任何合理的使用也应该如此。

就我个人而言,我会在我的 API 中远离它,而是创建一个单独的、更明确的方法。

在 Python 3.5.2 和 2.7.12 中测试。

解决方案 9:

正如@noɥʇʎԀʎzɐɹƆ 和 @phoenix 所提到的 - 您确实可以在存根文件中使用它。例如

class Foo:
    bar: Any = ...
    def __init__(self, name: str=...) -> None: ...

有关如何使用此省略号的更多信息和示例,请参见此处https://www.python.org/dev/peps/pep-0484/#stub-files

解决方案 10:

您可以自己使用省略号,在像 numpy 所做的那样的自定义切片情况下,但它在任何内置类中都没有用处。

我不知道它是否是专门为在 numpy 中使用而添加的,但我肯定没有看到它在其他地方使用。

另请参阅:如何在 Python 中使用省略号切片语法?

解决方案 11:

这是等效的。

l=[..., 1,2,3]
l=[Ellipsis, 1,2,3]

...是在 内部定义的常数built-in constants

省略

与省略号文字“...”相同。特殊值主要与用户定义容器数据类型的扩展切片语法结合使用。

解决方案 12:

它的预期用途不应该仅限于这些第三方模块。Python 文档中没有正确提及它(或者也许我只是找不到它),但省略号实际上...在 CPython 中至少有一个地方使用过。

它用于表示 Python 中的无限数据结构。我在玩列表时偶然发现了这个符号。

请参阅此问题以了解更多信息。

解决方案 13:

FastAPI 使用省略号来创建所需的参数。https
://fastapi.tiangolo.com/tutorial/query-params-str-validations/

解决方案 14:

在typer ...中用于创建所需的参数:该类Argument需要一个默认值,如果您传递它,...如果用户没有传递特定的参数,它会抱怨。

如果不存在,您可以使用None相同的方法Ellipsis,但这会消除表达默认值的机会None 以防您的程序有任何意义。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1579  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1355  
  信创产品在政府采购中的占比分析随着信息技术的飞速发展以及国家对信息安全重视程度的不断提高,信创产业应运而生并迅速崛起。信创,即信息技术应用创新,旨在实现信息技术领域的自主可控,减少对国外技术的依赖,保障国家信息安全。政府采购作为推动信创产业发展的重要力量,其对信创产品的采购占比情况备受关注。这不仅关系到信创产业的发展前...
信创和国产化的区别   8  
  信创,即信息技术应用创新产业,旨在实现信息技术领域的自主可控,摆脱对国外技术的依赖。近年来,国货国用信创发展势头迅猛,在诸多领域取得了显著成果。这一发展趋势对科技创新产生了深远的推动作用,不仅提升了我国在信息技术领域的自主创新能力,还为经济社会的数字化转型提供了坚实支撑。信创推动核心技术突破信创产业的发展促使企业和科研...
信创工作   9  
  信创技术,即信息技术应用创新产业,旨在实现信息技术领域的自主可控与安全可靠。近年来,信创技术发展迅猛,对中小企业产生了深远的影响,带来了诸多不可忽视的价值。在数字化转型的浪潮中,中小企业面临着激烈的市场竞争和复杂多变的环境,信创技术的出现为它们提供了新的发展机遇和支撑。信创技术对中小企业的影响技术架构变革信创技术促使中...
信创国产化   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用