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


539

名前空間をぼんやりとサーフィンしているときに、と呼ばれる奇妙なオブジェクトに気づきましたが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


19
私はそれを次のように見つけました:x=[];x.append(x);print(x)文字列化する循環オブジェクトをどのように処理するかを確認するためにを入力しました。戻りました[[...]]。私は私がで入力するとどうなるのだろうか」と思った[[...]]?私の推測では、それは構文エラーをスローしていました代わりに、それが返される。[[Ellipsis]]Pythonはとても奇妙で、このページに私を連れ続いたザ・Googleの検索。。。
Cyoce

22
...再帰的repr内は単なるプレースホルダーであり、関係がないことに注意してくださいEllipsis
Eevee

16
完全に補足すると、インポートのトリプルドットは「2つのパッケージからインポートする」ことを意味します。
狂牛病の物理学者

1
@croq stackoverflow.com/q/32395926/2988730stackoverflow.com/q/1054271/2988730。これらの2つはすべてを説明し、回答にはドキュメントとPEPへの適切なリンクが必要です。
マッド

回答:


558

これは最近別の質問で出てきました。そこから私の答えを詳しく説明します:

省略記号は、スライス表記で表示できるオブジェクトです。例えば:

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

その解釈は、__getitem__関数を実装し、Ellipsisそこにオブジェクトを表示するものに完全に依存しますが、その主な(および意図された)使用は、多次元配列型を追加する派手なサードパーティライブラリで使用されます。複数のディメンションがあるため、スライスは単なる開始インデックスと停止インデックスよりも複雑になります。同様に多次元でスライスできると便利です。たとえば、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と同じであり、4dのa[:,:,:,0]場合も同様a[0,...,0]ですa[0,:,:,0](ただし、中央の多くのコロンは完全な数を構成します)配列の次元の)。

興味深いことに、python3では、省略記号リテラル(...)はスライス構文の外でも使用できるため、実際に次のように記述できます。

>>> ...
Ellipsis

さまざまな数値型以外は、使用されていないと思います。私が知る限り、これは純粋に派手な使用のために追加されたものであり、オブジェクトと対応する構文を提供する以外にコアサポートはありません。そこにあるオブジェクトはこれを必要としませんでしたが、スライスの文字通りの "..."サポートが必要でした。


22
それはまた、スタブファイルにPEP484タイプヒンティングに使われています
noɥʇʎԀʎzɐɹƆ

24
誰かが気になった場合にtyping備えて:標準ライブラリモジュールでも使用されています。たとえば、シグネチャを指定せずにをCallable[..., int]返す呼び出し可能オブジェクトを示しintたりTuple[str, ...]、文字列の可変長同種タプルを示したりします。
アナカンド

6
参考までに、FastAPIフレームワーク(Python 3.6以降用)も(現在)使用しています。fastapi.tiangolo.com/tutorial/query-params-str-validations
Andrew Allaire

2
@ArtOfWarfareあなたは完全に正しいです、そしてこれは文章の間で後ずさりするのではなく言葉で「省略」を言う誰かから来ています
PrimeRibeyeDeal

私はこれを見つけました。あなたがリストに自己参照(循環参照)を作成したときに表示されるようだ:a = [1, 2]; a[0] = a; print(a)できます[[...], 2]。これは同じものですか、それとも別の用途ですか?
ビル・

220

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

def will_do_something():
    ...

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

def will_do_something():
    1

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


181
慣習の半分...では、後で記入するつもりの何か(「todo」の空のブロック)を示したい場合やpass、コードを持たないことを意図したブロックを意味する場合に使用されることがよくあります。
Gareth Latty、2012

26
PythonにはNotImplementedリテラルもあります。これは、不完全な関数が(None例の代わりに)意味のある何かを返すようにする場合に役立ちます。(別のユースケース:算術演算の実装
zvyn 2015年

13
@zvynそれは文字通りではありません。名前だけです。たとえばNotImplemented = 'something_else'、Pythonは有効です... = 'something_else'が、構文エラーです。
WIM

4
@zvynそのモジュールのインポート中に例外が発生した場合はどうなりますか?:)
pizzapants184 2017

7
@zvyn NotImplementedはの代替になることを意図していませんNone。その使用法はかなり狭いです。ここの
hans

69

Python 3.5およびPEP484以降、型指定モジュールを使用する場合、リテラルの省略記号は、静的型チェッカーに特定の型を示すために使用されます。

例1:

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

例2:

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

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

46

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

9
しかし、これは実際に楕円オブジェクトを含みますか?doctestパーサー/マッチャーの単なる機能ではないですか?
akaihola 2017年

1
@akaihola私はで説明したように、それは、ないことを言うだろうdoctest.ELLIPSIS。すべてではないにしても、ほとんどの使用...は構文でありuse、実際のEllipsisオブジェクトではないことを期待しています。それは実際には、適応可能なコンセプトの便利な名前に過ぎませんか?
nealmcb

34

Pythonのドキュメントから:

この目的は、一般的にスライシング(参照によって使用されているスライス表記を)。特別な操作はサポートしていません。Ellipsis(組み込み名)という名前の省略記号オブジェクトが1つだけあります。type(Ellipsis)()Ellipsisシングルトンを生成します。

Ellipsisまたはと書かれてい...ます。


25

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

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

可能な用途は次のとおりです。

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

14

__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でテスト済み。


これを-O引数を指定して実行すると、コードは常に; D
moshevi



2

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

Pythonで無限データ構造を表すために使用されます。リストで遊んでいるときにこの表記に出会いました。

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


8
この質問では、ellipsis組み込み型とEllipsisオブジェクトについて質問します。楕円で無限のデータ構造を表現することは純粋に表示のためであり、ellipsisタイプやEllipsisオブジェクトとは何の関係もありません。
chys

3
@chys実際には、それは小さな方法で行われます-Python __repr__文字列は有効なPython式になることを目的としています-省略記号が言語に存在しない場合は、表現は有効な式ではありません。
Gareth Latty、2014

3
@Lattywareまあ、それは元のデザインが真実であるため、意図しています。またeval(repr(a))、と等しくなることを目指していますa。残念ながら、組み込み型であっても、実際には時々誤りです。これを試してください:a=[]; a.append(a); eval(repr(a))repr(a)[[...]]、Python 2での無効な式です(Python 3では有効ですが、evalの結果は異なるものであり、元の意図に反しています。)
chys

1

これは同等です。

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

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

省略

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.