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

843voto

Brian Punkte 112487

Dies wurde in einem anderen Frage vor kurzem. Ich werde mein Vorhaben näher erläutern respuesta von dort aus:

Ellipsis ist ein Objekt, das in der Slice-Notation erscheinen kann. Zum Beispiel:

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

Ihre Auslegung ist allein Sache derjenigen, die die __getitem__ Funktion und sieht Ellipsis Objekte, aber seine Hauptverwendung (und beabsichtigte) ist in der numpy Bibliothek eines Drittanbieters, die einen mehrdimensionalen Array-Typ hinzufügt. Da es mehr als eine Dimension gibt, wird die Zerlegung komplexer als nur ein Start- und Stoppindex; es ist nützlich, auch in mehreren Dimensionen zerlegen zu können. Bei einem 4x4-Array z.B. würde der obere linke Bereich durch das Slice definiert werden [: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]])

Weiterführend wird hier Ellipsis verwendet, um einen Platzhalter für den Rest der nicht angegebenen Array-Dimensionen anzugeben. Stellen Sie sich das so vor, als ob es das komplette Slice anzeigt [:] für alle Dimensionen in der Lücke, in der es platziert ist, also für ein 3D-Array, a[...,0] と同じです。 a[:,:,0] und für 4d, a[:,:,:,0] Ähnlich, a[0,...,0] es a[0,:,:,0] (mit beliebig vielen Doppelpunkten in der Mitte, die die volle Anzahl der Dimensionen des Arrays ausmachen).

Interessant ist, dass in Python3 das Ellipsis-Literal ( ... ) ist außerhalb der Slice-Syntax verwendbar, so dass Sie tatsächlich schreiben können:

>>> ...
Ellipsis

Abgesehen von den verschiedenen numerischen Typen wird sie meines Erachtens nicht verwendet. Soweit ich weiß, wurde es nur für die Verwendung in Numpy hinzugefügt und hat keine andere Kernunterstützung als die Bereitstellung des Objekts und der entsprechenden Syntax. Das Objekt, das dort vorhanden ist, erforderte dies nicht, aber die wörtliche "..." Unterstützung für Slices schon.

380voto

tzot Punkte 86792

In Python 3 können Sie kann ¹ Verwenden Sie das Ellipsis-Wort ... als "nop"-Platzhalter für Code, der noch nicht geschrieben wurde:

def will_do_something():
    ...

Dies ist no magisch; jeder Ausdruck kann anstelle von ... , z.B.:

def will_do_something():
    1

(Ich kann das Wort "sanktioniert" nicht verwenden, aber ich kann sagen, dass diese Verwendung nicht gänzlich abgelehnt von Guido).

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

132voto

phoenix Punkte 5458

Ab Python 3.5 und PEP484 wird die literale Ellipse verwendet, um bestimmte Typen für einen statischen Typprüfer zu kennzeichnen, wenn er die Eingabe von Modul.

Beispiel 1:

Homogene Tupel beliebiger Länge können mit einem Typ und Auslassungszeichen ausgedrückt werden, z. B. Tuple[int, ...]

Beispiel 2:

Es ist möglich, den Rückgabetyp einer Callable zu deklarieren, ohne die Aufrufsignatur zu spezifizieren, indem man die Liste der Argumente durch eine wörtliche Ellipse (drei Punkte) ersetzt:

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

72voto

Zusammenfassend, was andere gesagt haben, ab Python 3, Ellipsis ist im Wesentlichen eine weitere Singleton-Konstante ähnlich zu None ohne einen bestimmten Verwendungszweck. Zu den bestehenden Verwendungen gehören:

  • In der Slice-Syntax zur Darstellung des vollständigen Slice in den übrigen Dimensionen
  • Beim Type Hinting, um nur einen Teil eines Typs anzugeben( Callable[..., int] o Tuple[str, ...] )
  • In Typ-Stub-Dateien, um anzuzeigen, dass es einen Standardwert gibt, ohne ihn anzugeben

Mögliche Verwendungszwecke könnten sein:

  • Als Standardwert für Orte, an denen None ist eine gültige Option
  • Als Inhalt für eine Funktion, die Sie noch nicht implementiert haben

49voto

Chiggs Punkte 2764

Sie können das Ellipsiszeichen auch verwenden, wenn Sie die erwarteten Doktortest Ausgabe:

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

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