名前空間をぼんやりと調べていると、「Ellipsis」という奇妙な外観のオブジェクトに気づきました。
検索後、NumpyとScipyによるスライス構文の不明瞭なバリアントで使用されていることがわかりましたが、他にはほとんど何もありません。
このオブジェクトは、特にNumpy + Scipyをサポートするために言語に追加されましたか? Ellipsisには一般的な意味や用途がありますか?
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
これは最近別の question で出てきました。 answer について詳しく説明します。
Ellipsis は、スライス表記で表示できるオブジェクトです。例えば:
myList[1:2, ..., 0]
その解釈は、純粋に__getitem__
関数を実装し、そこでEllipsis
オブジェクトを見るものまでですが、その主な(および意図された)使用は、多次元配列型を追加する numeric 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]])
これをさらに拡張するために、ここではEllipsisを使用して、指定されていない残りの配列次元のプレースホルダーを示します。配置されたギャップ内のすべての次元の[:]
スライス全体を示すと考えてください。したがって、3D配列の場合、a[...,0]
はa[:,:,0]
と同じであり、4Dの場合、a[:,:,:,0]
は、a[0,...,0]
はa[0,:,:,0]
です(ただし、中央は配列内の次元の完全な数を構成します)。
興味深いことに、python3では、Ellipsisリテラル(...
)はスライス構文の外部で使用できるため、実際に書くことができます:
>>> ...
Ellipsis
さまざまな数値型を除き、いいえ、使用されているとは思わない。私の知る限り、純粋にnumpyで使用するために追加されたもので、オブジェクトと対応する構文を提供する以外のコアサポートはありません。そこにあるオブジェクトはこれを必要としませんでしたが、スライスのリテラル「...」サポートは必要でした。
Python 3では、Ellipsisリテラル...
をコードの「nop」プレースホルダーとして使用できます。
def will_do_something():
...
これはnot魔法です; ...
の代わりに任意の式を使用できます。例:
def will_do_something():
1
(「認可」という言葉は使用できませんが、この使用は Guidoによって完全に拒否されませんでした と言えます。)
予想される 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
Pythonドキュメント から:
このオブジェクトは、拡張スライス表記で使用されます(Pythonリファレンスマニュアルを参照)。特別な操作はサポートしていません。
Ellipsis
(組み込み名)という名前のEllipsisオブジェクトが1つだけあります。
Python 3の時点で他の人が言ったことを要約すると、Ellipsisは本質的にNone
に似た別のシングルトン定数ですが、特定の用途はありません。既存の用途は次のとおりです。
Callable[..., int]
またはTuple[str, ...]
)考えられる用途は次のとおりです。
None
が有効なオプションである場所のデフォルト値としてEllipsisは、numpyが行ったようなカスタムスライシングの状況で自分で使用できますが、組み込みクラスでは使用できません。
Numpyで使用するために特別に追加されたかどうかはわかりませんが、他の場所で使用されたことは確かにありません。
__getitem__
最小の...
カスタムクラスの例
魔法の構文...
がカスタムクラスの[]
に渡されると、__getitem__()
はEllipsis
クラスオブジェクトを受け取ります。
クラスは、このシングルトンオブジェクトを使用して、必要な処理を実行できます。
例:
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から離れて、代わりに、より明示的な別のメソッドを作成するだけです。
Python 3.5.2および2.7.12でテスト済み。
@noɥʇʎԀʎzɐɹƆと@phoenixで述べたように-実際にスタブファイルで使用できます。例えば.
class Foo:
bar: Any = ...
def __init__(self, name: str=...) -> None: ...
この省略記号の使用方法の詳細と例については、こちらをご覧ください https://www.python.org/dev/peps/pep-0484/#stub-files
その意図された使用は、これらのサードパーティのモジュールだけに限定されるべきではありません。 Pythonのドキュメントでは適切に言及されていません(または、たぶん見つけられなかったかもしれません)が、Ellipsis ...
は実際にCPythonで使用されています少なくとも1か所で。
Pythonで無限のデータ構造を表すために使用されます。リストをいじりながらこの表記法に出会いました。
詳細については、 この質問 を参照してください。
これは同等です。
l=[..., 1,2,3]
l=[Ellipsis, 1,2,3]
...
は built-in constants
内で定義された定数です。
省略記号
省略記号「...」と同じです。ユーザー定義のコンテナーデータ型の拡張スライシング構文と組み合わせて主に使用される特別な値。