739

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

14 に答える 14

744

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

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

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

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

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

>>> ...
Ellipsis

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

于 2009-04-21T16:26:07.937 に答える
333

Python 3では、まだ記述されていないコードの「nop」プレースホルダーとして省略記号を使用できます。...

def will_do_something():
    ...

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

def will_do_something():
    1

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

¹'can' not in {'must', 'should'}

于 2011-05-31T14:39:41.713 に答える
109

Python 3.5およびPEP484の時点では、文字の省略記号は、タイピングモジュールを使用するときに静的タイプチェッカーに特定のタイプを示すために使用されます。

例1:

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

例2:

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

def partial(func: Callable[..., str], *args) -> Callable[..., str]:
    # Body
于 2016-05-28T13:08:47.027 に答える
60

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

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

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

  • Noneが有効なオプションである場所のデフォルト値として
  • まだ実装していない関数のコンテンツとして
于 2018-06-02T21:08:15.787 に答える
48

期待される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
于 2011-05-31T14:47:58.483 に答える
38

Pythonドキュメントから:

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

Ellipsisまたはとして記述され...ます。

于 2009-04-21T11:30:30.173 に答える
24

__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でそれを避け、代わりに別のより明示的なメソッドを作成します。

Python3.5.2および2.7.12でテスト済み。

于 2015-10-12T18:03:20.377 に答える
16

Pydanticを多用するコードベースでの作業からこの回答を得た人は、これはPydanticが必須のフィールドを示す方法でもありますがNone、「必須のオプションフィールド」と呼ばれるように設定できます。これが、FastAPIでも使用されるようになる理由です。

于 2021-03-17T02:37:01.753 に答える
14

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

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

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

于 2009-04-21T11:24:33.900 に答える
13

@noɥʇʎǀʎzɐɹƆと@phoenixで述べたように、実際にスタブファイルで使用できます。例えば

class Foo:
    bar: Any = ...
    def __init__(self, name: str=...) -> None: ...

この省略記号の使用方法の詳細と例については、https://www.python.org/dev/peps/pep-0484/#stub-filesを参照してください。

于 2018-01-23T11:11:19.090 に答える
3

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

Pythonで無限のデータ構造を表すために使用されます。リストをいじっているときに、この表記に出くわしました。

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

于 2013-07-20T15:42:41.807 に答える
3

これは同等です。

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

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

省略記号

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

于 2019-05-27T14:17:43.577 に答える
2

typerでは...必要なパラメーターを作成するために使用されます。Argumentクラスはデフォルト値を想定しており、渡すと...、ユーザーが特定の引数を渡さないと文句を言います。

Noneそこにない場合は同じように使用できますが、これにより、プログラムで意味がある場合に備えて、デフォルト値であるEllipsisと表現する機会がなくなります。None

于 2020-10-03T06:29:54.643 に答える
0

FastAPIは、省略記号を使用して必要なパラメーターを作成します。 https://fastapi.tiangolo.com/tutorial/query-params-str-validations/

于 2021-01-29T22:58:30.980 に答える