Python: Erstellen Sie eine Klasse, die entpackte Zuweisungen unterstützt

Notieren Sie sich das Ergebnis von Versuch und Irrtum und fragen Sie sich, wie eine entpackte Substitution realisiert wird.

Implementieren Sie getitem ()

>>> class MyTuple:
...     def __getitem__(self, key):
...         print(key)
...         if key < 3:
...             return str(key)
...         else:
...             raise IndexError
...

Es scheint, dass die Methode getitem () für die entpackte Zuweisung verwendet wird [^ 1]. Die Indexnummer wird als Schlüssel übergeben.

[^ 1]: Ich habe nach einem Dokument gesucht, aber es ist nicht sofort herausgekommen, also habe ich experimentiert und es nachgeschlagen.

Für gewöhnliche Aufgaben

getitem () wird nicht aufgerufen.

>>> x = MyTuple()
>>> x
<__main__.MyTuple object at 0x10a6bd850>

Für entpackte Aufgaben mit wenigen Elementen

__Getitem__ () wird für die Anzahl der Elemente auf der linken Seite + 1 Mal aufgerufen. Wenn "IndexError" in keinem der Aufrufe auftritt, wird angenommen, dass sich auf der rechten Seite viele Elemente befinden und "ValueError" auftritt.

>>> x, y = MyTuple()
0
1
2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 2)

Für entpackte Aufgaben mit übereinstimmender Anzahl von Elementen

__Getitem__ () wird für die Anzahl der Elemente auf der linken Seite + 1 Mal aufgerufen. Wenn beim letzten Aufruf "IndexError" auftritt, wird davon ausgegangen, dass das linke und das rechte Element übereinstimmen und die Zuweisung erfolgreich ist.

>>> x, y, z = MyTuple()
0
1
2
3
>>> x, y, z
('0', '1', '2')

Für entpackte Aufgaben mit vielen Elementen

__Getitem__ () wird für die Anzahl der Elemente auf der linken Seite + 1 Mal aufgerufen. Wenn "IndexError" in der Mitte des Aufrufs auftritt, wird davon ausgegangen, dass das Element auf der rechten Seite fehlt und die Zuweisung fehlschlägt.

>>> v, x, y, z = MyTuple()
0
1
2
3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: not enough values to unpack (expected 4, got 3)

Für entpackte Aufgaben mit *

Wenn sich auf der linken Seite ein Element mit "*" befindet, wird "getitem ()" aufgerufen, bis "IndexError" auftritt [^ 2]. Setzen Sie das Ergebnis auf nette Weise in die Variable auf der linken Seite ein.

[^ 2]: Gutes Gefühl ist PEP 3132 - Extended Iterable Unpacking.

>>> a, *b = MyTuple()
0
1
2
3
>>> a, b
('0', ['1', '2'])

Ein schönes Beispiel

>>> *a, b = MyTuple()
0
1
2
3
>>> a, b
(['0', '1'], '2')

Sie haben das Gefühl, dass Sie kein einziges Element haben müssen.

>>> *w, x, y, z = MyTuple()
0
1
2
3
>>> w, x, y, z
([], '0', '1', '2')
>>> w, *x, y, z = MyTuple()
0
1
2
3
>>> w, x, y, z
('0', [], '1', '2')
>>> w, x, *y, z = MyTuple()
0
1
2
3
>>> w, x, y, z
('0', '1', [], '2')
>>> w, x, y, *z = MyTuple()
0
1
2
3
>>> w, x, y, z
('0', '1', '2', [])

Aber wenn Sie keine zwei haben, können Sie nicht.

>>> *v, w, x, y, z = MyTuple()
0
1
2
3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: not enough values to unpack (expected at least 4, got 3)

Implementieren Sie iter ()

Sie können die Zuweisung auch entpacken, indem Sie "iter ()" anstelle von "getitem ()" implementieren.

>>> class MyTuple2():
...     def __iter__(self):
...         return iter([1, 2, 3])
...

Die Implementierung ist ziemlich kaputt, gibt jedoch einen Iterator für ein Array mit drei Elementen zurück. Es funktioniert richtig.

>>> x, y, z = MyTuple2()
>>> x, y, z
(1, 2, 3)

Zusammenfassung

Es kann entweder "getitem ()" oder "iter ()" verwendet werden. Wenn es [iterierbar] ist (https://docs.python.org/ja/3/glossary.html#term-iterable), wird es entpackt. Es kann als ersetzbar umformuliert werden.

Beispiele für wiederholbare Objekte sind alle Sequenztypen (Liste, Str, Tupel usw.), einige Nicht-Sequenztypen wie Diktat- und Dateiobjekte oder die Methode __iter__ () oder , die die Sequenzsemantik implementiert. Enthält eine Instanz einer Klasse mit der Methode __getitem__ () .

Recommended Posts

Python: Erstellen Sie eine Klasse, die entpackte Zuweisungen unterstützt
[Python] Erstellen Sie einen LineBot, der regelmäßig ausgeführt wird
Erstellen Sie eine Seite, die unbegrenzt mit Python geladen wird
[Hinweis] Erstellen Sie mit Python eine einzeilige Zeitzonenklasse
Erstellen Sie eine Python-Umgebung
Ich habe versucht, eine Klasse zu erstellen, mit der Json in Python problemlos serialisiert werden kann
Erstellen Sie eine gefälschte Klasse, die auch betrügt, ist Instanz
Erstellen Sie einen Chatbot, der die kostenlose Eingabe mit Word2Vec unterstützt
MALSS (Einführung), ein Tool, das maschinelles Lernen in Python unterstützt
Erstellen Sie ein Wox-Plugin (Python)
Erstellen Sie eine Funktion in Python
Erstellen Sie ein Wörterbuch in Python
Erstellen Sie ein Verzeichnis mit Python
Beachten Sie, dass es Python 3 unterstützt
[Python] Erstellen Sie einen Linebot, der ein beliebiges Datum auf ein Foto zeichnet
Erstellen wir ein Skript, das sich bei Ideone.com in Python registriert.
Erstellen eines Python-Skripts, das die e-Stat-API unterstützt (Version 2)
Erstellen Sie den Code, der in Python "A und vorgeben B" ausgibt
[MQTT / Python] Implementierte eine Klasse, die Pub / Sub von MQTT in Python ausführt
So schreiben Sie eine Meta-Klasse, die sowohl Python2 als auch Python3 unterstützt
Erstellen Sie mit tkinter eine Python-GUI
Erstellen Sie einen DI-Container mit Python
Erstellen Sie eine Python-Umgebung auf dem Mac (2017/4)
Erstellen Sie eine virtuelle Umgebung mit Python!
Erstellen Sie eine Binärdatei in Python
Erstellen Sie eine Python-Umgebung in Centos
Erstellen Sie ein universelles Dekorationsframework für Python
5 Möglichkeiten zum Erstellen eines Python-Chatbots
Erstellen Sie eine zufällige Zeichenfolge in Python
[Python] Erbt eine Klasse mit Klassenvariablen
Erstellen Sie eine Instanz einer vordefinierten Klasse aus einer Zeichenfolge in Python
[Python / Django] Erstellen Sie eine Web-API, die im JSON-Format antwortet
[Ev3dev] Erstellen Sie ein Programm, das das LCD (Bildschirm) mit Python erfasst
[LINE Messaging API] Erstellen Sie einen BOT, der eine Verbindung zu jemandem mit Python herstellt
Ich werde versuchen, eine Python-Verzeichnisstruktur zu erstellen, die ich später nicht bereuen werde
Eine Klasse, die häufig verwendete Methoden in Twitter API (Python) zusammenfasst.
[Python] Ich habe eine Klasse erstellt, die schnell einen Dateibaum schreiben kann
Generieren Sie eine erstklassige Sammlung in Python
[Python] Ein Programm, das Treppen mit # erstellt
Erstellen Sie ein neues numerisches Python-Berechnungsprojekt
Klasse, die die API von DMM trifft
[Python] Wie man eine Klasse iterierbar macht
Erstellen Sie mit Python + PIL ein Dummy-Image.
Erstellen Sie eine Python-Umgebung auf Ihrem Mac
Erstellen wir eine virtuelle Umgebung für Python
[Python] [LINE Bot] Erstellen Sie einen LINE Bot mit Papageienrückgabe
Erstellen Sie mit Python 3.4 einen Worthäufigkeitszähler
Technologie, die Python Descriptor #pyconjp unterstützt
Erstellen Sie eine Deb-Datei aus einem Python-Paket
[GPS] Erstellen Sie eine kml-Datei mit Python
Generieren Sie eine Klasse aus einer Zeichenfolge in Python
Eine typisierte Welt, die mit Python beginnt
Erstellen wir eine Kundendatenbank, in der QR-Code automatisch in Python ausgegeben wird
Unterstützt Python 2.4
Erstellen Sie einen Bot, der Twitter-Trends verstärkt
Ein Programm, das Python zum Abspielen von Junk verwendet
[Python] Ein Programm, das die Partitur rundet
Aus einem Buch, das Programmierer lernen können (Python): Klassendeklaration (öffentlich / privat usw.)