Path: csiph.com!fu-berlin.de!uni-berlin.de!not-for-mail From: Achim Domma Newsgroups: de.comp.lang.python Subject: [Python-de] =?utf-8?q?Fwd=3A_Re=3A__Syntax-Erweiterung_f=C3=BCr_S?= =?utf-8?q?chleifen_in_Python3?= Date: Sun, 10 Apr 2016 21:49:56 +0200 Lines: 60 Message-ID: References: <570AAE64.1030109@procoders.net> Mime-Version: 1.0 Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 8bit X-Trace: news.uni-berlin.de 7TIdoffQv3CEOp5/ilTmzQqF4nbNP6bRxaCV8Evf6oIg== Return-Path: X-Original-To: python-de@python.org Delivered-To: python-de@mail.python.org X-Forwarded-Message-Id: User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.5.1 X-PPP-Message-ID: <20160410194957.3616.6808@webhosting05.marketing-thom.de> X-PPP-Vhost: procoders.net X-BeenThere: python-de@python.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: Die Deutsche Python Mailingliste List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Mailman-Original-Message-ID: <570AAE64.1030109@procoders.net> Xref: csiph.com de.comp.lang.python:4395 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