fein, fein, fein. kriegst auch noch mehr tipps
wenn du deine files mit datumsangaben versiehts (was nicht schlecht ist), dann a) schreib das jahr 4stellig und b) schreib es rückwärts, also z.b. 2004-09-22, damit die dateien stets über ihren dateinamen auch gleich zeitlich richtig sortiert werden.
docstrings:
|
Source code
|
1
2
3
|
def configure():
"""Ask the user for configuration data and store it to file."""
print ...
|
dann: in python sind alles dynamische objekte. d.h. du kannst über configure auf die funktion an sich zugreifen und sie auch speichern, sie über configure() wie erwartet ausführen und z.b. über configure.__doc__ eben auf ihren docstring zugreifen. das kann man auch sinnvoll im code verwenden, um automatisch hilfetexte zu generieren.
exkurs "module in python":
in python kann man jedes script auch als modul aus einer anderen datei oder im interaktiven interpreter laden. heißt die datei "meins.py", kann man sie mit "import meins" laden. dabei hat sie den namespace "meins" und man kann mit "meins.configure()" auf ihre methoden zugreifen. mit "from meins import configure" kann man die methode configure() oder klassen, variablen, etc. in den globalen namespace des importierenden scripts laden und sie ohne "meins." davor verwenden.
auch in deinem fall empfiehlt es sich, den code so zu gestalten, dass man ihn später wiederverwenden kann, z.b. über eine GUI oder in einer website.
es empfiehlt sich folgendes konstrukt am ende der datei, dass nur ausgeführt wird, wenn das script direkt ausgeführt und nicht als modul geladen wird:
|
Source code
|
1
2
|
if __name__ == '__main__':
main()
|
der hauptteil des codes, der die anderen funktionen verwendet, kann entweder direkt anstelle von main() dort stehen oder aber eben in eine eigene methode main() ausgelagert werden. dies ist sinnvoll, wenn man ein script ohne "dos"-fenster starten möchte. unter windows kann man die datei dann in .pyw umbenennen und sie wird ohne console gestartet. will/muss man das original beibehalten, kann man die .pyw neu erzeugen und in ihr das andere modul importieren und über obiges konstrukt + den entsprechenden namespace ihre main-funktion aufrufen - das geht nicht, wenn der code im teil steht, der nur bei direktem aufruf ausgeführt wird.
|
Source code
|
1
2
3
4
5
6
7
8
|
"""meinscriptmitGUI.pyw
script ohne console starten, z.b. weil es eine gui hat
"""
import meinscript
if __name__ == '__main__':
meinscript.main()
|
|
Source code
|
1
2
3
4
|
value = raw_input('step ' + str(y) + ':\n' + label + ': ')
# besser mit %
value = raw_input('step %d:\n%s: ' % (y, label))
|
und wenn du mit "y" schritte zählst, dann nenn das ding doch auch "step".
|
Source code
|
1
2
3
4
5
|
if value != '':
config.set('DEFAULT', key, value)
break
else:
print 'value is not valid'
|
das else: (nicht aber das print) ist überflüssig, da du im falle des if abbiegst und aus der schleife springst, daher würde das print auch nicht ausgeführt werden. das print muss dann natürlich auch ausgerückt werden (bis auf höhe des if), damit es nicht als teil des if-blocks ausgeführt wird.
|
Source code
|
1
2
3
4
5
6
7
8
9
10
|
if os.path.exists(file):
try:
f = open(file, 'rb')
break;
except:
print ' ... Unexpected error:', sys.exc_info()[0]
print 'TIP: the file you entered exists but can not be opened, check your permissions'
return()
else:
print 'file ' + file + ' does not exist'
|
- hinter dem break ist ein ";". das ist nicht nötig, schadet eher (der lesbarkeit) und wird nur gebraucht, wenn man mehrere befehle in eine zeile schreiben möchte (was man tunlichst nicht sollte!). scheint aus gewohntheit dort hingekommen zu sein

- "return" ist keine funktion und wird daher ohne () geschrieben. wird kein wert angegeben, wird immer None zurückgegeben.
- du kannst die lesbarkeit weiter verbessern, indem du die fehlerbehandlung am anfang durchführst und dann den nicht erreichbaren rest nicht mehr einrückst (das else weglassen, s.o.)
|
Source code
|
1
2
3
4
5
6
7
8
9
10
|
if [u]not[/u] os.path.exists(file):
print 'file ' + file + ' does not exist'
continue # breche diesen loop ab und beginne einen neuen durchlauf
try:
f = open(file, 'rb')
break
except:
print ' ... Unexpected error:', sys.exc_info()[0]
print 'TIP: the file you entered exists but can not be opened, check your permissions'
return
|
um pfad-teile zu konkatenieren, empfiehlt sich ein blick auf die entsprechenden methoden im modul "os", da man ja auf verschiedenen OS auch mit verschiedenen pfad-trennzeichen zu tun hat.
übrigens: es gibt in python KEIN switch-statement, wohl aber einige (fragwürdige) versuche, es zu erzeugen. braucht man aber nicht, sagt guido v.r., und darum gibt es das nicht als separates sprachkonstrukt.