859 Stimmen

Was macht das Ellipsis-Objekt?

Beim untätigen Surfen im Namensraum fiel mir ein seltsam aussehendes Objekt namens Ellipsis Es scheint nichts Besonderes zu sein oder zu tun, aber es ist ein global verfügbares Builtin.

Nach einer Suche fand ich, dass es in einigen obskuren Variante der Slicing-Syntax von Numpy und Scipy verwendet wird... aber fast nichts anderes.

Wurde dieses Objekt der Sprache speziell zur Unterstützung von Numpy + Scipy hinzugefügt? Hat Ellipsis überhaupt eine generische Bedeutung oder Verwendung?

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

40voto

Simon Lieschke Punkte 12682

De la Python-Dokumentation :

Dieses Objekt wird in der Regel beim Slicing verwendet (siehe Schnitte ). Sie unterstützt keine spezielle Operationen. Es gibt genau ein Ellipsis-Objekt, genannt Ellipsis (ein eingebauter Name). type(Ellipsis)() erzeugt die Ellipsis Singleton.

Sie wird geschrieben als Ellipsis o ... .

30voto

tykom Punkte 439

Für alle, die diese Antwort aus einer Codebasis mit intensiver Pydantic-Nutzung kennen: So zeigt Pydantic auch ein Feld an, das erforderlich ist, aber auf einen Wert gesetzt werden kann None die sie als " erforderliche optionale Felder ". Aus diesem Grund werden sie auch in FastAPI verwendet.

29voto

__getitem__ minimal ... Beispiel in einer benutzerdefinierten Klasse

Wenn die magische Syntax ... wird übergeben an [] in einer benutzerdefinierten Klasse, __getitem__() erhält eine Ellipsis Klassenobjekt.

Die Klasse kann dann mit diesem Singleton-Objekt machen, was sie will.

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)

Die in Python eingebaute list Klasse wählt die Semantik eines Bereichs, und jede vernünftige Verwendung sollte dies natürlich auch tun.

Ich persönlich würde es in meinen APIs einfach weglassen und stattdessen eine separate, explizitere Methode erstellen.

Getestet in Python 3.5.2 und 2.7.12.

14voto

sykora Punkte 88704

Sie können Ellipsis selbst verwenden, in benutzerdefinierten Slicing-Situationen, wie es numpy getan hat, aber es hat keine Verwendung in einem builtin Klasse.

Ich weiß nicht, ob es speziell für die Verwendung in Numpy hinzugefügt wurde, aber ich habe es sicherlich nicht anderswo verwendet gesehen.

Siehe auch: Wie verwendet man die Ellipsis-Slicing-Syntax in Python?

14voto

henryJack Punkte 3470

Wie von @noz und @phoenix erwähnt - Sie können es in der Tat in Stub-Dateien verwenden. z.B.

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

Weitere Informationen und Beispiele für die Verwendung dieser Ellipse finden Sie hier https://www.python.org/dev/peps/pep-0484/#stub-files

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X