Seite 1 von 1

Vernünftige Hybridlösung für Iterator (method-wrapper)

Verfasst: Sonntag 11. Januar 2015, 22:12
von darktrym
Ich hatte heute den halben Tag zugebraucht um eine Lösung für ein Problem zu finden. Kurz, es hatte jemand auf Basis dieses Artikels(Codequalität?) seinen Parser gebastelt.
Ich brauchte den Python 3 Support. Drehpunkt war, dass Python 3 sich an einer Stelle deutlich von Python 2 unterscheidet, Stichwort Binden und Iterator.

Präziser das Problem tritt hier auf:

Code: Alles auswählen

def parse(program):
    global token, next
    next = tokenize(program).next
    token = next()
    return expression()
Letzten Endes hab ich die Lösung über Ausnahmebehandlung von Attributerror und .__next__ bzw. .next gewählt. Finde diesen aber wegen den illegalen Zugriff ein wenig unschön. Wie würde man das richtig machen?

Re: Vernünftige Hybridlösung für Iterator (method-wrapper)

Verfasst: Sonntag 11. Januar 2015, 22:41
von pillmuncher
darktrym hat geschrieben:Letzten Endes hab ich die Lösung über Ausnahmebehandlung von Attributerror und .__next__ bzw. .next gewählt. Finde diesen aber wegen den illegalen Zugriff ein wenig unschön.
Illegaler Zugriff? Hast du Angst, verhaftet zu werden? ;)
Wie würde man das richtig machen?
Versuch es mal so:

Code: Alles auswählen

>>> def foo():
...     for i in range(3):
...         yield i
...
>>> ns = foo()
>>> advance = lambda: next(ns)
>>> advance()
0
>>> advance()
1
>>> advance()
2
>>> advance()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <lambda>
StopIteration
Ausprobiert in Python 2.7 und 3.2. Den Namen advance() habe ich gewählt, damit das Builtin next() nicht überschrieben wird.