Hier einige Sample erklären:Python: Durchlaufen Objekt Ausführung von Code sowohl an bestimmten Orten und auch am Ende
outputText=""
counter=0
for obj in specialObjects:
if (obj.id < 400) or (obj.name.startswith("he")) or (obj.deliberateBreak==True):
print "The object %s is causing a section break."%obj.details
outputText = outputText.rjust(80)
open("file%d.txt"%counter,"w").write(outputText)
outputText=""
outputText+=obj.shortValue()
# THIS CODE IS DUPLICATED
outputText = outputText.rjust(80)
open("file%d.txt"%counter,"w").write(outputText)
Was muss ich tun Iterierte über eine Liste dieser speziellen Objekte und lassen ein paar unterschiedliche Bedingungen jedes Mal. Wenn eine der Bedingungen erfüllt ist (wie hier zu sehen ist), muss ich den aktuellen Ausgabepuffer nehmen, ihn in eine Datei schreiben, dann einen neuen Ausgabepuffer starten und die Verarbeitung fortsetzen.
Das Problem hier ist die Code-Duplizierung. Beachten Sie, dass die beiden Zeilen (outputText = und open) dupliziert sind. Wenn ich den zweiten Satz von Zeilen nicht einfüge, wird der letzte Satz von Objekten verarbeitet, aber ihre Ausgabe wird niemals geschrieben.
Ich kann mir zwei mögliche Lösungen vorstellen, um die Code-Duplizierung zu verhindern. Beide scheinen etwas unelegant zu sein, also fragte ich mich, ob es einen noch besseren Weg gab.
1) Wickeln Sie den Code, der in einer Funktion wiederholt werden würde.
2) Verwenden Sie stattdessen eine numerische for-Schleife und zählen Sie bis eins höher als die Länge der Objektliste; verwendet diesen Wert als Flag bedeuten „schreiben, aber jetzt verlassen“:
outputText=""
counter=0
for obj in range(len(specialObjects))+1:
if (obj = len(specialObjects)) or (specialObjects[obj].id < 400) or (specialObjects[obj].name.startswith("he")) or (specialOejcts[obj].deliberateBreak==True):
print "The object %s is causing a section break."%specialObjects[obj].details
outputText = outputText.rjust(80)
open("file%d.txt"%counter,"w").write(outputText)
outputText=""
if (obj==len(specialObjects)):
break
outputText+=specialObjects[obj].shortValue()
Wenn ich eine Wahl hätte, ich wahrscheinlich # 2, würde holt aber einige seltsamen Grenzfälle zu schaffen mit der könnte am Ende 'if' Anweisung, wenn jemals eine komplexere boolesche Logik verwendet werden muss.
Gibt es einen noch saubereren oder mehr "Pythonic" Weg, dies ohne Code-Duplizierung zu erreichen?
Danke!
Im mittleren Beispiel ändern Sie nur 'counter'. Sollten die erste und die letzte Version die gleiche Datei mehrmals öffnen und dann einfach verwerfen, ohne zu schließen, oder fehlt ihnen etwas Code? – Useless
Dies könnte ein Duplikat von [Vermeidung von Wiederholungen von Code nach Schleife?] Sein (http://stackoverflow.com/questions/11149997/avoiding-repeat-of-code-after-loop) – jme