[Python-de] Fwd: Re: Syntax-Erweiterung für Schleifen in Python3

Achim Domma domma at procoders.net
So Apr 10 15:49:56 EDT 2016


On Saturday, 09 April, 2016 09:19 AM, Stefan Schwarzer wrote:

> Ich habe darüber nachgedacht, aber mir ist kein besserer
> Ansatz eingefallen wie in den schon geschriebenen Antworten.
[...]
> Fällt euch noch etwas ein?

Ich würde gerne mal einen realen Anwendungsfall sehen. Zumindest ist das 
die Frage, die ich einem Kollegen stellen würde, der mit dem Problem auf 
mich zu kommt. Für mich "riecht" die Frage nach einem verstecken 
Workaround für ein anderes Problem.

Meiner Ansicht nach unterwandert die Fragestellung etwas das abstrakte
Konzept eines Iterators. Eine Iterator liefert "on demand" Werte und
eine For-Schleife verarbeitet sie "stupide" einen nach dem anderen. Die
"Buchhaltung" ob der Iterator je ein Ergebnis geliefert hat,
interessiert normal nicht, wird her aber gewünscht. Meiner Ansicht nach
ist die For-Schleife der falsche Platz. Ich würde das im Iterator lösen
und hab' mal ganz auf die Schnelle folgendes zusammengehackt:

class Wrapper():
     def __init__(self, it):
         self.it = it
         self.called = False

     def __iter__(self):
         return self

     def __next__(self):
         nxt = self.it.__next__
         result = nxt()
         self.__next__ = nxt
         self.called = True
         return result

empty = Wrapper(iter([]))

for x in empty:
     print(x)

print(empty.called)

not_empty = Wrapper(iter([1,2,3]))

for x in not_empty:
     print(x)

print(not_empty.called)

Das kann man sicher noch schöner schreiben. Ich hatte auch überlegt,
keine eigene Klasse zu verwenden, sondern einen Generator und die
"called" property am original Iterator zu setzen. Beides hat Vor- und
Nachteile. Meine Entscheidung würde wohl vom konkreten Problem und
dessen Scope abhängen.

Grüße,
Achim





Mehr Informationen über die Mailingliste python-de