Seite 1 von 1
Guter Code Stil
Verfasst: Freitag 17. Juli 2009, 10:41
von cryzed
Hey, Ich weiß es gibt PEP-8 und das "import this" aber gibt es daneben noch irgendwas an Dokumentation was man mit seinem Code tun und lassen sollte? Z.b folgendes:
Code: Alles auswählen
#!/usr/bin/env python
import os
def main():
if not os.path.exists("test.txt"):
test = open("test.txt", "w")
test = open("test.txt", "a")
def main2():
if os.path.exists("test.txt"):
test = open("test.txt", "a")
else:
test = open("test.txt", "w")
Was würdet ihr benutzen? Ich finde main() an sich schöner und kompakter, macht aber 2 potentielle Zugriffe auf die test.txt. main2() sieht meiner Meinung nicht so toll aus ist aber wahrscheinlich potentiell schneller. Es gibt viele Dinge wo ich mir nicht ganz sicher bin. Z.b prüfe ich besser bei einer if bedingung auf false (not) oder auf true? Kann ich das built-in "file" überschreiben weil ich eh "open" verwende und innerhalb meines programms gar nicht gebrauche? Wenn ich über eine Liste von Dateien iteriere benutze ich als iterator "file_", "f" oder sonst eine Abwandlung? Ist es eine gute Idee einfach "i" als iteratorvariable zu benutzen so wie es oft in C++/C gemacht wird, oder sollte ich den Anfangsbuchstaben des jeweiligen Objekts benutzen? (File, f; Person, p)...
Verfasst: Freitag 17. Juli 2009, 10:47
von EyDu
Eigentlich würde man keine deiner Versionen benutzen, dass würde man über ein try-except lösen. Nach dem Test und vor dem Öffnen könnte die Datei immerhin gelöscht werden.
Edit: Entweder hast du nachbearbeitet, oder ich habe deinen restlichen Text übersehen:
Um Geschwindigkeit solltest man sich erstmal keine Gedanken machen. Ob nun ein open oder zwei ist relativ egal.
Wie du deine Bedingungen bei if gestaltes, ob mit not oder ohne, ist relativ egal. Mit einer einfachen Negation sollte jeder zurecht kommen.
built-ins solltest generell nicht überschrieben werden. Nur weil sie momentan nicht gebraucht werden, heißt es nicht, dass sie später im Code vielleicht doch nützlich sind. Außerdem erschwerst du damit anderen das Lesen deines Codes.
Beim Iterieren solltest du den Namen so wählen, dass er etwas über die Bedeutung aussagt. Da ist "file_" ein äußerst schlechter Name. Bennene es lieber danach, was sich in der Datei befindet, oder was damit gemacht wird. Das gilt für alle Namen. Btw.: Der Iterator ist nicht der Name (linke Seite der for-Schleife), sondern das "Ding" welches über die Werte iteriert (rechte Seite). Was das "i" angeht, gibt es sicher tausend Meinungen. Für einfache Indizes nutze ich "i", viele andere werden "index" schreiben. Das mit den Anfangsbuchstaben ist an sich eine ganz schlechte Idee, dort gilt wieder die Namenswahl nach Bedeutung.
Verfasst: Freitag 17. Juli 2009, 11:33
von ms4py
Wieso das ``+`` ??
Legt die Datei an, wenn sie nicht vorhanden ist. Macht doch kein Problem aus etwas, das gar kein Problem ist.
Verfasst: Freitag 17. Juli 2009, 11:35
von cryzed
ice2k3 hat geschrieben:Wieso das ``+`` ??
Legt die Datei an, wenn sie nicht vorhanden ist. Macht doch kein Problem aus etwas, das gar kein Problem ist.
Tut es nicht. Auf jeden Fall nicht unter Linux.
Verfasst: Freitag 17. Juli 2009, 11:37
von ms4py
Und mit dem + gehts?
Edit: Mir fällt gerade ein, bei mir ging das auch schon unter Linux!
Verfasst: Freitag 17. Juli 2009, 11:39
von cryzed
ice2k3 hat geschrieben:Und mit dem + gehts?
Edit: Mir fällt gerade ein, bei mir ging das auch schon unter Linux!
Merkwürdig, du hast Recht. In Python 2.5.x wurde immer eine Exception geworfen...
Verfasst: Freitag 17. Juli 2009, 12:05
von Pekh
cryzed hat geschrieben:ice2k3 hat geschrieben:Und mit dem + gehts?
Edit: Mir fällt gerade ein, bei mir ging das auch schon unter Linux!
Merkwürdig, du hast Recht. In Python 2.5.x wurde immer eine Exception geworfen...
Nein, das hat auch schon unter 2.5 und Linux ohne + funktioniert. Und auch bei den Versionen davor. Muß also andere Gründe gehabt haben ...
Verfasst: Freitag 17. Juli 2009, 14:09
von lunar
EyDu hat geschrieben:Eigentlich würde man keine deiner Versionen benutzen, dass würde man über ein try-except lösen. Nach dem Test und vor dem Öffnen könnte die Datei immerhin gelöscht werden.
Ein "try … except …" ist auch nicht atomar. Zwischen dem Abfangen der Ausnahme und dem weiteren Zugriff könnte die Datei ebenfalls gelöscht oder verändert werden.
Edit: "a" und "a+" erzeugen unter Linux immer eine neue Datei, wenn diese nicht existiert. Das ist durch die Dokumentation der C-Funktion
fopen() garantiert, auf die die Python-Dokumentation zu
open() verweist.
Verfasst: Freitag 17. Juli 2009, 15:56
von snafu
Ich würde das so in der Art machen:
Code: Alles auswählen
with open('test.txt', 'a') as testfile:
testfile.write(data)