web-dev-qa-db-ja.com

Python Ellipsisオブジェクトは何をしますか?

名前空間をぼんやりと調べていると、「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
412
Salim Fadhley

これは最近別の 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で使用するために追加されたもので、オブジェクトと対応する構文を提供する以外のコアサポートはありません。そこにあるオブジェクトはこれを必要としませんでしたが、スライスのリテラル「...」サポートは必要でした。

449
Brian

Python 3では、Ellipsisリテラル...をコードの「nop」プレースホルダーとして使用できます。

def will_do_something():
    ...

これはnot魔法です; ...の代わりに任意の式を使用できます。例:

def will_do_something():
    1

(「認可」という言葉は使用できませんが、この使用は Guidoによって完全に拒否されませんでした と言えます。)

158
tzot

予想される 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
41
Chiggs

Python 3.5および PEP484 の時点で、リテラルの省略記号は、 typing モジュールを使用するときに特定の型を静的型チェッカーに示すために使用されます。

例1:

任意の長さの同種のタプルは、1つの型と省略記号を使用して表現できます。たとえば、Tuple[int, ...]

例2:

引数のリストをリテラルの省略記号(3つのドット)に置き換えることにより、呼び出し署名を指定せずに呼び出し可能オブジェクトの戻り値の型を宣言することができます。

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

Pythonドキュメント から:

このオブジェクトは、拡張スライス表記で使用されます(Pythonリファレンスマニュアルを参照)。特別な操作はサポートしていません。 Ellipsis(組み込み名)という名前のEllipsisオブジェクトが1つだけあります。

31
Simon Lieschke

Python 3の時点で他の人が言ったことを要約すると、Ellipsisは本質的にNoneに似た別のシングルトン定数ですが、特定の用途はありません。既存の用途は次のとおりです。

  • 残りの次元の完全なスライスを表すスライス構文
  • 型の一部のみを示す型ヒント(Callable[..., int]またはTuple[str, ...]
  • タイプスタブファイルに、指定せずにデフォルト値があることを示す

考えられる用途は次のとおりです。

  • Noneが有効なオプションである場所のデフォルト値として
  • あなたがまだ実装していない関数のコンテンツとして

Ellipsisは、numpyが行ったようなカスタムスライシングの状況で自分で使用できますが、組み込みクラスでは使用できません。

Numpyで使用するために特別に追加されたかどうかはわかりませんが、他の場所で使用されたことは確かにありません。

参照: PythonでEllipsisスライス構文をどのように使用しますか?

11
sykora

__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

3
henryJack

その意図された使用は、これらのサードパーティのモジュールだけに限定されるべきではありません。 Pythonのドキュメントでは適切に言及されていません(または、たぶん見つけられなかったかもしれません)が、Ellipsis ...は実際にCPythonで使用されています少なくとも1か所で。

Pythonで無限のデータ構造を表すために使用されます。リストをいじりながらこの表記法に出会いました。

詳細については、 この質問 を参照してください。

2
Aseem Bansal

これは同等です。

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

...built-in constants 内で定義された定数です。

省略記号

省略記号「...」と同じです。ユーザー定義のコンテナーデータ型の拡張スライシング構文と組み合わせて主に使用される特別な値。

0
prosti