Während ich untätig im Namespace surfte, bemerkte ich ein seltsam aussehendes Objekt namens Ellipsis
, es scheint nichts Besonderes zu sein oder zu tun, aber es ist ein global verfügbares integriertes Objekt.
Nach einer Suche fand ich heraus, dass es in einer obskuren Variante der Slicing-Syntax von Numpy und Scipy verwendet wird ... aber fast nichts anderes.
Wurde dieses Objekt speziell zur Unterstützung von Numpy + Scipy zur Sprache hinzugefügt? Hat Ellipse ü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
x=[];x.append(x);print(x)
, um zu sehen, wie es mit dem Stringing zyklischer Objekte umging. Es kehrte zurück[[...]]
. Ich dachte: "Ich frage mich, was passiert, wenn ich tippe[[...]]
? Ich vermute, es würde einen Syntaxfehler auslösen. Stattdessen kehrte er zurück[[Ellipsis]]
. Python ist so seltsam. Die darauf folgende Google-Suche brachte mich auf diese Seite....
in einem rekursiven Repr nur ein Platzhalter ist und keine Beziehung zuEllipsis
Antworten:
Dies kam kürzlich in einer anderen Frage auf . Ich werde von dort aus auf meine Antwort eingehen:
Ellipse ist ein Objekt, das in Slice-Notation angezeigt werden kann. Zum Beispiel:
Seine Interpretation hängt ausschließlich von dem ab, was die
__getitem__
Funktion implementiert undEllipsis
Objekte dort sieht , aber seine Hauptverwendung (und beabsichtigte Verwendung) liegt in der numpy -Bibliothek eines Drittanbieters, die einen mehrdimensionalen Array-Typ hinzufügt. Da es mehr als eine Dimension gibt, wird das Schneiden komplexer als nur ein Start- und Stoppindex. Es ist nützlich, auch in mehreren Dimensionen schneiden zu können. Bei einem 4x4-Array würde der obere linke Bereich beispielsweise durch das Slice definiert[:2,:2]
:In diesem Zusammenhang wird Ellipse hier verwendet, um einen Platzhalter für die übrigen nicht angegebenen Array-Dimensionen anzugeben. Denken Sie daran , als Hinweis auf die volle Scheibe
[:]
für alle Dimensionen in dem Spalte sie platziert wird, so dass für ein 3D - Array,a[...,0]
ist das gleiche wiea[:,:,0]
und 4da[:,:,:,0]
, in ähnlicher Weise,a[0,...,0]
ista[0,:,:,0]
(mit jedoch vielen Doppelpunkten in der Mitte bildet die volle Zahl von Dimensionen im Array).Interessanterweise kann in python3 das Ellipsis-Literal (
...
) außerhalb der Slice-Syntax verwendet werden, sodass Sie tatsächlich schreiben können:Abgesehen von den verschiedenen numerischen Typen, nein, ich glaube nicht, dass es verwendet wird. Soweit mir bekannt ist, wurde es nur für den Numpy-Gebrauch hinzugefügt und hat keine andere Kernunterstützung als die Bereitstellung des Objekts und der entsprechenden Syntax. Das Objekt, das dort war, erforderte dies nicht, aber die wörtliche "..." Unterstützung für Slices tat dies.
quelle
typing
: z. B.Callable[..., int]
um eine aufrufbare Dateiint
anzugeben, die eine ohne Angabe der Signatur zurückgibt , oderTuple[str, ...]
um ein homogenes Tupel variabler Länge von Zeichenfolgen anzugeben .a = [1, 2]; a[0] = a; print(a)
erstellen : gibt[[...], 2]
. Ist das das Gleiche oder eine andere Verwendung?In Python 3 können Sie das Ellipsen-Literal
...
als Platzhalter für Code verwenden:Das ist keine Magie; Jeder Ausdruck kann verwendet werden anstelle von
...
z.(Ich kann das Wort "sanktioniert" nicht verwenden, aber ich kann sagen, dass diese Verwendung von Guido nicht direkt abgelehnt wurde.)
quelle
...
verwendet, wo Leute etwas angeben möchten, das sie später ausfüllen möchten (ein leerer 'todo'-Block) undpass
einen Block bedeuten sollen, der keinen Code haben soll.NotImplemented
Literal, das nützlich ist, wenn Ihre unvollständige Funktion etwas Sinnvolles zurückgeben soll (anstattNone
wie in Ihrem Beispiel). (Ein weiterer Anwendungsfall: Implementieren von arithmetischen Operationen )NotImplemented = 'something_else'
ist Python gültig, aber es... = 'something_else'
ist ein Syntaxfehler.NotImplemented
ist keine Alternative zuNone
. Seine Verwendung ist eher eng. Siehe Dokumentation hierAb Python 3.5 und PEP484 wird die wörtliche Ellipse verwendet, um bestimmte Typen einer statischen Typprüfung zu kennzeichnen, wenn das Typisierungsmodul verwendet wird.
Beispiel 1:
Beispiel 2:
quelle
Sie können auch die Ellipse verwenden, wenn Sie die erwartete Doctest- Ausgabe angeben :
quelle
...
gehe davon aus, dass die meisten, wenn nicht alle Verwendungen von syntaktisch sind und nichtuse
das eigentliche Ellipsis-Objekt. Ist es nicht wirklich nichts anderes als ein handlicher Name für ein anpassungsfähiges Konzept?Aus der Python-Dokumentation :
quelle
Zusammenfassend ist Ellipsis ab Python 3 eine weitere Singleton-Konstante, die der Singleton-Konstante ähnelt
None
, jedoch ohne eine bestimmte beabsichtigte Verwendung ist. Bestehende Verwendungen umfassen:Callable[..., int]
oderTuple[str, ...]
)Mögliche Verwendungen könnten sein:
None
eine gültige Option istquelle
__getitem__
minimales...
Beispiel in einer benutzerdefinierten KlasseWenn die Magie Syntax
...
zu übergeben wird[]
in einer benutzerdefinierten Klasse,__getitem__()
erhält einEllipsis
Klassenobjekt.Die Klasse kann dann mit diesem Singleton-Objekt tun, was sie will.
Beispiel:
Die in Python integrierte
list
Klasse gibt ihr die Semantik eines Bereichs, und jede vernünftige Verwendung sollte dies natürlich auch tun.Persönlich würde ich mich in meinen APIs einfach davon fernhalten und stattdessen eine separate, explizitere Methode erstellen.
Getestet in Python 3.5.2 und 2.7.12.
quelle
Sie können Ellipsis selbst verwenden, in benutzerdefinierten Slicing-Situationen, wie es Numpy getan hat, aber es wird in keiner integrierten Klasse verwendet.
Ich weiß nicht, ob es speziell für die Verwendung in Numpy hinzugefügt wurde, aber ich habe es sicherlich nicht anderswo gesehen.
Siehe auch: Wie verwenden Sie die Syntax zum Schneiden von Auslassungspunkten in Python?
quelle
Wie von @ noɥʇʎԀʎzɐɹƆ und @phoenix erwähnt - Sie können es tatsächlich in Stub-Dateien verwenden. z.B
Weitere Informationen und Beispiele zur Verwendung dieser Auslassungspunkte finden Sie hier https://www.python.org/dev/peps/pep-0484/#stub-files
quelle
Die beabsichtigte Verwendung sollte nicht nur für diese Module von Drittanbietern sein. Es wird in der Python-Dokumentation nicht richtig erwähnt (oder vielleicht konnte ich das einfach nicht finden), aber die Auslassungspunkte
...
werden in CPython tatsächlich an mindestens einer Stelle verwendet.Es wird zur Darstellung unendlicher Datenstrukturen in Python verwendet. Ich bin auf diese Notation gestoßen, als ich mit Listen herumgespielt habe.
Weitere Informationen finden Sie in dieser Frage .
quelle
ellipsis
eingebauten Typ und demEllipsis
Objekt. Die Darstellung unendlicher Datenstrukturen mit Ellipsen dient lediglich der Anzeige und hat nichts mitellipsis
Typ oderEllipsis
Objekt zu tun .__repr__
Zeichenfolgen sollen gültige Python-Ausdrücke sein -, wenn in der Sprache keine Auslassungspunkte vorhanden wären, wäre die Darstellung kein gültiger Ausdruck.eval(repr(a))
gleich seina
. Leider ist es in der Praxis von Zeit zu Zeit falsch, selbst bei eingebauten Typen. Probieren Sie es aus :a=[]; a.append(a); eval(repr(a))
.repr(a)
ist[[...]]
, ungültiger Ausdruck in Python 2. (In Python 3 ist es gültig, aber das Bewertungsergebnis ist etwas anderes, immer noch entgegen der ursprünglichen Absicht.)Das ist gleichwertig.
...
ist eine im Inneren definierte Konstantebuilt-in constants
.quelle