Hey Leute,
ich hab in den letzten 3 Tagen mal versucht einen ganz simplen Chat zu schreiben
Ich hoffe ein Profi kann sich das ganze mal ansehn und mir sagen was ich falsch mache bzw. man besser machen kann.
Danke euch
Download: http://drop.io/thepychat
pyChat
Achte auf PEP8 (z.B. Klassennamen in CamelCase, EOL79). Bei console_client.py auf die Einrückung achten (nach ``while True:`` sollte wohl eingerückt werden). gui_client.py: Zeile 84 kann man so ersetzen:
Das ist zwar länger und für Anfänger unleserlich, aber dafür cooler
Insgesamt sieht es aber nach gutem Code aus (weniger als Minute raufgeschaut).
Code: Alles auswählen
>>> from functools import partial
>>> from operator import eq
>>> ip, name, port = '127.0.0.1', '', '80'
>>> is_empty_string = partial(eq, '')
>>> any(is_empty_string(entry) for entry in (ip, name, port))
True
Insgesamt sieht es aber nach gutem Code aus (weniger als Minute raufgeschaut).
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Wenn du es leichter verfuegbar machen kannst als ein `zip` wirst du mehr Rueckmeldungen bekommen.
Aber wenigstens ist es kein `rar` ...
Aber wenigstens ist es kein `rar` ...
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Hallo weißned, willkommen im Forum,
Ich has mir nicht im Detail angeschaut aber ansonsten sehe ich keine weiteren offensichtlichen WTFs, insofern kann ich mich derdon anschließen dass der Code insgesamt recht gelungen scheint. Was ich dir aber empfehlen könnte wäre ein Blick in asyncore, speziell asynchat scheint ziemlich gut zu deinem Problem zu passen.
cofi, naja ZIP sehe ich zwar nicht so gerne wie Tarballs, aber es ist IMHO ein brauchbarer Kompromiss der für die meisten Platformen annehmbar ist. Und drop.io ist zum runterladen noch annehmbar, nicht so wie gewisse, im folgenden ungenannte Filehoster. Ein Upload auf Bitbucket/Github wäre natürlich der logische nächste Schritt
Ja. Das die Module nach Klassen aufgeteilt sind macht in meinen Augen wenig Sinn, eine thematische Ordnung fände ich besser. Auch client.py und clients.py finde ich - verwirrend, zudem clients.py eine ziemlich sinnlose Klasse ist (Python hat Properties - keine Getter und Setter nötig, die zudem nichts tun). Ich würde auch viel weniger String-Konkatenation nutzen, mehr String-Formatting um Daten anzupassen. Da spart man sich auch das wrappen von Kram in ``str()`` und es ist klarer was dargestellt werden soll. Achja, ``input`` ist eine eingebaute Funktion, die überschreibst du an irgendeiner Stelle - sollte man besser nicht machen.weißned hat geschrieben:Hat sonst noch jemand was anzumerken=?
Ich has mir nicht im Detail angeschaut aber ansonsten sehe ich keine weiteren offensichtlichen WTFs, insofern kann ich mich derdon anschließen dass der Code insgesamt recht gelungen scheint. Was ich dir aber empfehlen könnte wäre ein Blick in asyncore, speziell asynchat scheint ziemlich gut zu deinem Problem zu passen.
cofi, naja ZIP sehe ich zwar nicht so gerne wie Tarballs, aber es ist IMHO ein brauchbarer Kompromiss der für die meisten Platformen annehmbar ist. Und drop.io ist zum runterladen noch annehmbar, nicht so wie gewisse, im folgenden ungenannte Filehoster. Ein Upload auf Bitbucket/Github wäre natürlich der logische nächste Schritt
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Hey ich habs jetzt geschafft ein bitbucket repo zu machen, bloß wenn ich auf Source kilcke steht dort, dass keine Dateien da sind aber ich habe sie hoch geladen.
Wenn ich eine Revision anklicke sehe ich die ja auch, hat jemand ne Ahnung wie man das machen kann den Source Code anzuzeigen ohne eine bestimmte Revision anzuklicken müssen?
naja also hier der Code: http://bitbucket.org/mjdv/thepychat/src/tip
@Leonidas ich habe die Klasse clients jetzt in server.py getan, aber ich glaube ich brauche diese Klasse doch, es sind nämlich nicht nur getter und setter enthalten!
edit:
Wegen dem input, überschreibe ich die input Funktion auch wenn ich eine Varible input habe?
Wenn ich eine Revision anklicke sehe ich die ja auch, hat jemand ne Ahnung wie man das machen kann den Source Code anzuzeigen ohne eine bestimmte Revision anzuklicken müssen?
naja also hier der Code: http://bitbucket.org/mjdv/thepychat/src/tip
@Leonidas ich habe die Klasse clients jetzt in server.py getan, aber ich glaube ich brauche diese Klasse doch, es sind nämlich nicht nur getter und setter enthalten!
edit:
Wegen dem input, überschreibe ich die input Funktion auch wenn ich eine Varible input habe?
Zuletzt geändert von weißned am Sonntag 28. Februar 2010, 17:45, insgesamt 1-mal geändert.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Du kannst den Hash in der URL durch "tip" ersetzen, dann zeigt es auf die aktuellste Revision.weißned hat geschrieben:Wenn ich eine Revision anklicke sehe ich die ja auch, hat jemand ne Ahnung wie man das machen kann den Source Code anzuzeigen ohne eine bestimmte Revision anzuklicken müssen?
Ja, denn Python ist ein Lisp-1^W^W eine Sprache mit nur einem Namespace indem sowohl Funktionen als auch sonstige Namen sind. Variablen hat Python an sich nicht.weißned hat geschrieben:Wegen dem input, überschreibe ich die input Funktion auch wenn ich eine Varible input habe?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Okay, kann man das auch machen wenn man so auf den Source Button klickt oder muss immer eine Revision ausgewählt sein?Leonidas hat geschrieben:Du kannst den Hash in der URL durch "tip" ersetzen, dann zeigt es auf die aktuellste Revision.weißned hat geschrieben:Wenn ich eine Revision anklicke sehe ich die ja auch, hat jemand ne Ahnung wie man das machen kann den Source Code anzuzeigen ohne eine bestimmte Revision anzuklicken müssen?
Mein Gott …derdon hat geschrieben:Code: Alles auswählen
>>> from functools import partial >>> from operator import eq >>> ip, name, port = '127.0.0.1', '', '80' >>> is_empty_string = partial(eq, '') >>> any(is_empty_string(entry) for entry in (ip, name, port)) True
Code: Alles auswählen
any(not entry for entry in (ip, name, port))
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Ich hab dir mal einen pull-Request mit meinen Änderungen geschickt...
Außerdem, was mir aufgefallen ist: du handhabst Fehler durch leere Strings! Dafür gibt es Exceptions, die sollte man auch nutzen. So kann es vorkommen dass man vergisst irgenwelche Fehler abzufangen und dann kracht es an unerwarteten Stellen.
Außerdem, was mir aufgefallen ist: du handhabst Fehler durch leere Strings! Dafür gibt es Exceptions, die sollte man auch nutzen. So kann es vorkommen dass man vergisst irgenwelche Fehler abzufangen und dann kracht es an unerwarteten Stellen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Indem du von seinem Repository pullst
`hg pull $repository`
und dann eben pushen
`hg pull $repository`
und dann eben pushen
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
Oh okay danke, ich dachte da gibst ne Funktion wo ich dann ja sagen muss, dass ich die Änderungen in mein Repo übernehmen will xD
Danke
edit:
Das mit den leeren Strings stimmt schon ist ein wenig doof, aber wir könnt ich es denn anders lösen? Soll ich dann selber eine Exception auslösen?
Danke
edit:
Das mit den leeren Strings stimmt schon ist ein wenig doof, aber wir könnt ich es denn anders lösen? Soll ich dann selber eine Exception auslösen?
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Ja. Du kannst ja auch eigene Exceptions definieren.weißned hat geschrieben:Das mit den leeren Strings stimmt schon ist ein wenig doof, aber wir könnt ich es denn anders lösen? Soll ich dann selber eine Exception auslösen?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Also zum Beispiel:
Wäre das okay so?
Code: Alles auswählen
try:
c.send(message)
except Exception as ex:
raise MyError('error sending message!\nDetails: %s\n%s' %(type(ex), ex)
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Ja. In Ordnung ist das aber nur, wenn du den Typ nicht genauer weisst (und selbst dann ist `except BaseException` zu bevorzugen).
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Statt dem except Exception würde ich eher die spezifische Exception abfangen. Sonst verschluckst du gegebenfalls irgendwelche wirklich unerwarteten Ausnahmefälle.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
cofi hat geschrieben:In Ordnung ist das aber nur, wenn du den Typ nicht genauer weisst (und selbst dann ist `except BaseException` zu bevorzugen).
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
... oder wenn ein Syntaxfehler im Code ist oder wenn der User das Programm beenden möchte ...weißned hat geschrieben:Naja ich möchte aber das jede beliebige Exception abgefangen wird, also zum Beispiel auch wenn man für Port keine Zahl eingegeben hat.