Path: csiph.com!fu-berlin.de!uni-berlin.de!not-for-mail From: Achim Domma Newsgroups: de.comp.lang.python Subject: Re: [Python-de] War die Idee mit Iteratoren/Generatoren wirklich so super? Date: Tue, 25 Jul 2017 11:35:49 +0200 Lines: 88 Message-ID: References: <392f5a95-defa-0f3d-0f1a-d0b554c2fa34@thomas-guettler.de> <453333fe-6382-427e-8837-94d3ece32bcc@procoders.net> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Trace: news.uni-berlin.de /RQMWYJAY96NlEsaVTL3qQeKbPtc+CEwuV3NVQwAzzqw== Return-Path: X-Original-To: python-de@python.org Delivered-To: python-de@mail.python.org User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.1.1 In-Reply-To: <392f5a95-defa-0f3d-0f1a-d0b554c2fa34@thomas-guettler.de> Content-Language: en-US X-PPP-Message-ID: <20170725093550.5800.47870@webhosting01.marketing-thom.de> X-PPP-Vhost: procoders.net X-BeenThere: python-de@python.org X-Mailman-Version: 2.1.24 Precedence: list List-Id: Die Deutsche Python Mailingliste List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Mailman-Original-Message-ID: <453333fe-6382-427e-8837-94d3ece32bcc@procoders.net> X-Mailman-Original-References: <392f5a95-defa-0f3d-0f1a-d0b554c2fa34@thomas-guettler.de> Xref: csiph.com de.comp.lang.python:4852 Neben den anderen schon angesprochenen sinnvollen Anwendungsfällen, kann man mit Generatoren jede Menge lustige Sachen bauen, die in der Regel aber in komplexeren Frameworks passieren. Hier mal kurz mein Lieblingsbeispiel, das ich sehr oft mit sehr guten Erfahrungen nutze: Um Daten zu transformieren, implementieren wir "worker", die Ergebnisse zu einem Dokument berechnen. D.h. wir haben Listen von Dokument in der Art: { 'id': 123, 'title': 'xyz', 'abstract': 'mehr text' } Die Transformationen sind Funktionen der Art: def just_do_it(doc): return mache_etwas_tolles_mit(doc['title']) Und dann eben: results = [just_do_it(d) for d in docs] Soweit alles super simpel. Aber was machst du, wenn mache_etwas_tolles ein setup und teardown braucht? Z.B. das Öffnen einer Datenbankverbindung? Postgres ist ja immer eine gute Idee! ;-) Die offensichtliche Lösung sind Objekte, Basisklassen, ... Ja das geht, bläht den Code aber auf und erzeugt "Rauschen", das ich nicht mag. Wir machen das so: def worker_factory(): # hier steht der setup code con = open_connection() def worker(doc): return mache_etwas(doc, con) yield worker # teardown code con.close() Ich mag es sehr, daß der zusammengehörende Code schön kompakt an einer Stelle steht. Niemand kann unnötige Objekthierarchien einführen, ... Zieht man jetzt noch in Betracht, daß ja auch yield ein Ergebnis zurück liefern kann, das von außen via next mitgegeben wird, kann man Abläufe bauen, die du anders sicher nicht hinbekommst. Ob du das willst, ist natürlich eine andere Fragen. Aber bitte laß mir diese Option! ;-) Grüße, Achim On Tuesday, 25 July, 2017 10:14 AM, Thomas Güttler wrote: > Anfangs war ich total begeistert von Iteratoren und Generatoren. > > Die Begeisterung ist nicht mehr vorhanden, schließlich ist es nichts > Neues und darum auch nichts Spannendes mehr. > > Wenn ich zum Debugging etwas untersuchen will, und dann das hier finde: > > > > ... Dann ist ein weiterer "Edit, Compile, Run Cycle" nötig. > > Dieser "Cycle" geht in Python schnell, aber trotzdem nervt es ein > klitzekleinesbischen. > > Ich frage mich: Bringt der Einsatz von Iteratoren und Generatoren > wirklich so viel? > > Sicherlich gibt es extreme Beispiele bei denen die Datenmenge nicht in > den Hauptspeicher passen würde. > > Aber solche Datenmengen habe ich im PostgreSQL, und ich mache auch > Schleifchen über alle Daten > in der DB :-) > > Wie seht ihr das? > > Gruß, > Thomas >