在闲置浏览命名空间的同时,我注意到一个名为" Ellipsis " 的奇怪物体,它似乎没有或做任何特殊的事情,但它是一个全局可用的内置.
在搜索之后,我发现它被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
Run Code Online (Sandbox Code Playgroud)
Bri*_*ian 495
省略号是一个可以以切片表示法出现的对象.例如:
myList[1:2, ..., 0]
Run Code Online (Sandbox Code Playgroud)
它的解释完全取决于实现__getitem__
函数和查看Ellipsis
对象的任何东西,但它的主要(和预期)用途是在数字python扩展中,它添加了一个多维数组类型.由于存在多个维度,因此切片变得比起始和停止索引更复杂; 能够在多个维度中切片也很有用.例如,给定一个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]])
Run Code Online (Sandbox Code Playgroud)
进一步扩展,省略号用于指示未指定的其余数组维度的占位符.可以把它想象成指示[:]
它所放置的间隙中所有尺寸的完整切片,因此对于3d数组,与4d a[...,0]
相同,同样地,是(中间有许多冒号组成全部数字)数组中的维度).a[:,:,0]
a[:,:,:,0]
a[0,...,0]
a[0,:,:,0]
有趣的是,在python3中,Ellipsis literal(...
)可以在切片语法之外使用,因此您可以实际编写:
>>> ...
Ellipsis
Run Code Online (Sandbox Code Playgroud)
除了各种数字类型,不,我不认为它被使用.据我所知,它纯粹是为了使用numpy而添加,除了提供对象和相应的语法之外没有核心支持.那里的对象并不需要这个,但对切片的字面"......"支持确实如此.
tzo*_*zot 185
在Python 3中,您可以将Ellipsis文字...
用作代码的"nop"占位符:
def will_do_something():
...
Run Code Online (Sandbox Code Playgroud)
这不是魔术; 可以使用任何表达式代替...
,例如:
def will_do_something():
1
Run Code Online (Sandbox Code Playgroud)
(不能使用"制裁"这个词,但我可以说这种用法并没有被Guido 彻底拒绝.)
pho*_*nix 56
从Python 3.5和PEP484开始,当使用输入模块时,文字省略号用于表示静态类型检查器的某些类型.
例1:
例如,可以使用一种类型和省略号来表示任意长度的同构元组
Tuple[int, ...]
例2:
可以通过用文字省略号(三个点)替换参数列表来声明可调用的返回类型而不指定调用签名:
def partial(func: Callable[..., str], *args) -> Callable[..., str]:
# Body
Run Code Online (Sandbox Code Playgroud)
Chi*_*ggs 45
在指定预期的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
Run Code Online (Sandbox Code Playgroud)
Mat*_*eld 18
总结其他人所说的,从Python 3开始,省略号本质上是另一个类似的单例常数None
,但没有特定的预期用途.现有用途包括:
Callable[..., int]
或Tuple[str, ...]
)可能的用途包括:
None
有效选项的地方的默认值Cir*_*四事件 13
__getitem__
...
自定义类中的最小示例
...
[]
当你使用"神奇的" __getitem__()
语法时,它将作为单例类魔术值传递给你.
然后,班级可以随心所欲地做任何事情.
例:
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)
Run Code Online (Sandbox Code Playgroud)
Python内置Ellipsis
类选择为其提供范围的语义,当然也应该使用它的任何合理用法.
就个人而言,我只是在我的API中远离它,并创建一个单独的,更明确的方法.
syk*_*ora 12
您可以在numpy已经完成的自定义切片情况下自己使用省略号,但它在任何内置类中都没有用.
我不知道它是否是专门用于numpy,但我当然没有看到它用于其他地方.
另请参阅:如何在Python中使用省略号切片语法?
hen*_*ack 11
正如@no ?????z 所提到的?和@phoenix - 您确实可以在存根文件中使用它。例如
class Foo:
bar: Any = ...
def __init__(self, name: str=...) -> None: ...
Run Code Online (Sandbox Code Playgroud)
可以在此处找到有关如何使用此省略号的更多信息和示例https://www.python.org/dev/peps/pep-0484/#stub-files
这是等价的。
\nl=[..., 1,2,3]\nl=[Ellipsis, 1,2,3]\n
Run Code Online (Sandbox Code Playgroud)\n...
是内部定义的常量built-in constants
。
\n\n省略
\n与省略号文字 \xe2\x80\x9c...\xe2\x80\x9d 相同。特殊值主要与用户定义的容器数据类型的扩展切片语法结合使用。
\n
归档时间: |
|
查看次数: |
123634 次 |
最近记录: |