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

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

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?
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

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.
In specifications, Murphy's Law supersedes Ohm's.
Antworten