Python 省略对象是做什么的?
在悠闲地浏览名称空间时,我注意到一个奇怪的对象,名为Python 省略对象是做什么的?,python,ellipsis,Python,Ellipsis,在悠闲地浏览名称空间时,我注意到一个奇怪的对象,名为省略号,它似乎没有什么特别之处,也没有做任何特别的事情,但它是一个全局可用的内置对象 经过一次搜索,我发现它被Numpy和Scipy用在一些模糊的切片语法变体中。。。但几乎没有别的 将此对象添加到语言中是否专门用于支持Numpy+Scipy?省略号有任何一般意义或用法吗 D:\workspace\numpy>python Python 2.4.4 (#71, Oct 18 2006, 08:34:43) [MSC v.1310 32 bi
省略号
,它似乎没有什么特别之处,也没有做任何特别的事情,但它是一个全局可用的内置对象
经过一次搜索,我发现它被Numpy和Scipy用在一些模糊的切片语法变体中。。。但几乎没有别的
将此对象添加到语言中是否专门用于支持Numpy+Scipy?省略号有任何一般意义或用法吗
D:\workspace\numpy>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
您可以自己使用省略号,在像numpy这样的自定义切片情况下,但它在任何内置类中都没有用处 我不知道它是否是专门为在numpy中使用而添加的,但我肯定没有在其他地方看到它的使用 另请参见:中的: 此对象通常用于切片(请参见)。它不支持 特别行动。只有一个省略号对象,名为 省略号(内置名称)<代码>类型(省略号)(生成省略号 辛格尔顿 它写为
省略号
或…
这是最近在另一次会议上提出的。我将从这里详细阐述我的观点:
是可以以切片表示法显示的对象。例如:
myList[1:2, ..., 0]
它的解释完全取决于实现\uuu getitem\uuu
函数并在其中查看省略号
对象的任何内容,但它的主要(和预期)用途是在第三方库中,该库添加了多维数组类型。由于存在不止一个维度,切片变得比仅仅开始和停止索引更复杂;能够在多个维度中进行切片也很有用。例如,给定一个4x4数组,左上方区域将由切片[: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,:,:,,,,,,,,,,,,,,,,,,,(中间有许多冒号构成数组中的全部维数)。
有趣的是,在python3中,省略号文本(…
)在切片语法之外是可用的,因此您实际上可以编写:
>>> ...
Ellipsis
除了各种数字类型之外,不,我认为没有使用它。据我所知,它纯粹是为了numpy使用而添加的,除了提供对象和相应的语法外,没有其他核心支持。那里的对象不需要这个,但是文字“…”对切片的支持已完成。在Python 3中,您可以使用省略号literal..
作为尚未编写的代码的“nop”占位符:
def will_do_something():
...
这是不魔术;可以使用任何表达式代替…
,例如:
def will_do_something():
1
(不能使用“制裁”这个词,但我可以说这是Guido使用的。)
“%code>'can'不在{'must'、'should'}
指定预期输出时,也可以使用省略号:
类MyClass(对象):
“”“doctest省略号示例
>>>thing=MyClass()
>>>#匹配和
>>>类型(thing)#doctest:+省略号
"""
通过
它的预期用途不应该只用于这些第三方模块。Python文档中没有正确提到它(或者我就是找不到),但是省略号…
实际上在CPython中至少有一处使用过
它用于在Python中表示无限的数据结构。我是在处理列表时发现这个符号的
有关更多信息,请参见。\uuu getitem\uuu
最小值。
自定义类中的示例
当魔法语法..
传递给自定义类中的[]
时,\uuu getitem\uuuuuuuuuuu()
接收一个省略号
类对象
然后,该类可以对这个单例对象执行任何它想要的操作
例如:
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)
# 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] == (1, slice(2,3,4), Ellipsis, 6)
Python内置的list
类选择给它一个范围的语义,当然任何合理的使用也应该如此
就我个人而言,我只是在我的API中远离它,而是创建一个单独的、更显式的方法
在Python3.5.2和2.7.12中进行了测试。从Python3.5和开始,文字省略号用于在使用模块时向静态类型检查器表示某些类型
例1:
任意长度的同构元组可以使用一种类型和省略号表示,例如Tuple[int,…]
例2:
通过用文字省略号(三个点)替换参数列表,可以在不指定调用签名的情况下声明可调用的返回类型:
正如@noɥ647;ԀzɐɹƆ和@phoenix所提到的,您确实可以在存根文件中使用它
class Foo:
bar: Any = ...
def __init__(self, name: str=...) -> None: ...
关于如何使用省略号的更多信息和示例可以在这里找到总结其他人所说的,从Python 3开始,省略号本质上是另一个类似于None
,但没有特定用途的单例常量。现有用途包括:
- 在切片语法中,表示剩余维度中的完整切片
- 在类型提示中,仅指示类型的一部分(
可调用[…,int]
或元组[str,…]
)
- 在中键入存根文件以指示存在默认值,而不指定它
可能的用途包括:
- 作为
None
为有效选项的位置的默认值
- 作为尚未实现的函数的内容
这是等效的
l=[..., 1,2,3]
l=[Ellipsis, 1,2,3]
…
是内部定义的常量
省略号
与省略号文本“…”相同。特殊值主要与扩展切片语法结合使用
class Foo:
bar: Any = ...
def __init__(self, name: str=...) -> None: ...
l=[..., 1,2,3]
l=[Ellipsis, 1,2,3]