Es wurden Tabs statt Leerzeichen zum Einrücken benutzt. Das kann schnell zu "unsichtbaren" Problemen führen wenn Tabs und Leerzeichen gemischt werden. Zum Beispiel sieht die Anzeige des Quelltextes mit anderen Einstellungen was denn nun ein Tab sein soll falsch aus. Das betrifft zum Beispiel Zeile 64 die nur mit Leerzeichen eingerückt ist. Empfehlung ist 4 Leerzeichen pro Ebene zu benutzen. Ebenfalls empfohlen ist ein Leerzeichen nach Kommata und vor und nach binären Operatoren.
Die read_parameter()
-Funktion ist sehr eigenartig. Sie liesst eigentlich gar keinen Parameter und gibt entweder False
oder eine Zeichenkette zurück, was eine sehr komische, unsaubere Mischung ist.
read_file()
ist sehr umständlich und ineffizient. Dateien sind "iterable", das heisst man kann direkt über die Zeilen iterieren statt diese umständliche ``while``-Schleife zu verwenden. Und ein Tupel ist hier die falsche Datenstruktur, weil die nicht veränderbar ist. Darum dieses umständliche "hinzufügen", was jedesmal ein neues Tupel erzeugt, also den Inhalt des alten im Speicher kopiert nur um eine neue Zeile anzuhängen. Ausserdem wird die Datei in der Funktion nicht wieder geschlossen. Die einfachste Art eine Datei komplett in eine Liste einzulesen:
def read_file(filename):
in_file = open(filename)
result = list(in_file)
in_file.close()
return result
Es ist aber eigentlich gar nicht nötig die komplette Datei auf einen Schlag in den Speicher zu lesen, wenn man nur über die Zeilen iterieren möchte, weil man das wie gesagt direkt mit dem Dateiobjekt machen kann.
Auch print_log
ist umständlich. Wenn man eine "do…while"/"do…until"-Schleife hat, wird das in Python idiomatisch als "Endlosschleife" mit einer ``if``-Abfrage und ``break`` zum verlassen der Schleife ausgedrückt. Dann muss man keinen Code mehrfach schreiben. Aus:
spam = get_something()
while condition(spam):
do_something(spam)
spam = get_something()
wird:
while True:
spam = get_something()
if not condition(spam):
break
do_something(spam)
Schöner ist es natürlich die ersten drei Zeilen des Schleifenkörpers in einem Iterator zu verpacken und in einer ``for``-Schleife zu verwenden.
Das ständige öffnen und schliessen der Datei ist unnötig. Die Bedingung sieht nicht sehr robust aus, falls sich die Ausgabe von ``wget`` mal ändern sollte. Statt das externe Programm ``clear`` aufzurufen könnte man auch dafür die entsprechedne ANSI-Sequenz ausgeben. Die ANSI-formatierten Ausgaben liessen sich per ``%`` kürzer und übersichtlicher schreiben:
print '\033[%d;H%s' % (zeile * 3, link)
print '\033[%d;H%s' % (zeile * 3 + 1, last_line)[/code]
Das ``else`` bei der ``while``-Schleife macht keinen Sinn. Der Block sollte einfach nach der ``while``-Schleife stehen, eine Ebene weniger tief eingerückt.
Wenn eine Funktion nicht funktioniert wenn man kein vernünftiges Argument angibt, sollte man dieses Argument nicht mit einem ungültigen Wert vorbelegen. Das Argument `str_file` bei `init_download()` kann/sollte nie die leere Zeichenkette sein. An der ``if``/``else``-Konstruktion in dieser Funktion sieht man wie komisch der Rückgabewert von `read_parameter()` ist.
In Zeile 64 ist ein lustiger Fehler, der dafür sorgt, das `zeile` nach dem ersten Schleifendurchlauf immer 1 ist. Statt selber hochzuzählen, kannst Du mal einen Blick auf die `enumerate()`-Funktion werfen.