
Jürgen K. Leese wrote:
Hallo,
ich bin gerade über die etwas sehr schräge Behandlung von lokalen Variablen gestolpert. Daran lässt sich natürlich nichts ändern, die Frage ist, wie mache ich Folgendes besser?
In einer Funktion, die irgendwas zeilenweise ausliest, habe ich diese Hilfsfunktion definiert:
def holezeile(): nonlocal zeile, zeilennummer zeile = zeilevonirgendwoeinlesen() zeilennummer += 1
In der übergeordneten Funktion, die zeile und zeilennummer verwurstet, wird holezeile() an gut einem Dutzend Stellen aufgerufen - daher die vergesslichkeitsfehlersichere Stütze mit holezeile(). Sollte ich an holezeile() mal etwas ändern wollen, möchte ich das nicht an einem Dutzend Stellen machen müssen.
Die nonlocal-Zeile finde ich hässlich, und diejenigen, die sich den Kram ausgedacht haben, sollen wohl der Meinung sein, der Zugriff auf übergeordnete Variablen wäre eh schlechter Stil.
Hässlich und schlecht. Aber wie mache ich sowas denn nun schön und gut, ohne dabei denselben Code dutzendmal zu wiederholen?
Normalerweise verwendet man file-Objekte und enumerate():
with open(dateiname) as zeilen: for zeilennummer, zeile in enumerate(zeilen): ....
Trifft man mal auf eine Funktion zum Zeilenlesen, wird die sofort in einen Iterator gepackt:
zeilen = iter(zeile_von_irgendwo_einlesen, "") for zeilennummer, zeile in enumerate(zeilen): ...
Dass man "an einem Dutzend Stellen" Zeilen aus dem gleichen Stream liest, ist eher untypisch -- wenn du ein bisschen mehr Kontext lieferst, hat vielleicht einer einen Tip, wie sich das reduzieren lässt.