Verfasst: Samstag 2. Januar 2010, 11:58
@maxi_king_333: Die Namen von *Klassen* sollten gross geschrieben werden. `Tkinter` ist doch keine Klasse, sondern ein Modul. Und bei dem `socket`-Beispiel binde ich nicht das Modul `socket` an den Namen `Socket`, sondern die Klasse `socket` *aus* diesem Modul. Interessanterweise heist die Klasse ursprünglich `_socketobject` und wird erst nachträglich an den Namen `socket` gebunden:
Die Komplexität wird *jetzt* noch nicht gebraucht. Auf die Objekte in den Dictionaries wird nicht zugegriffen, also kann man sie auch weglassen.
Und ich versteh's immer noch nicht. Mir ist klar, dass man für verschiedene Ereignisse, die man Melden möchte, jeweils Objekte benötigt, die diese Verarbeiten, den Benutzer informieren, oder auch andere Aktionen auslösen. Aber warum muss man die in diese Dictionaries stecken? Warum mit Zufallszahlen als Schlüssel? Wie soll man da je wieder *gezielt* herankommen? Und wenn man das nicht kann, warum stecken die dann nicht einfach in Listen? Warum willst Du da später noch einmal drauf zugreifen? Gib doch mal bitte ein konkretes Beispiel.
Das mit `Thread` kann man so schreiben, aber ich würde in dem Fall die Schlüsselworte explizit hinschreiben, statt Platzhalterargumente anzugeben.
Die Frage mit der Klasse habe ich nicht verstanden!? Man kann in Klassen auf alle Namen zugreifen, die auf Modulebene bekannt sind.
Das Problem mit `recv()` ist, dass die Gegenseite 'test\ntest1\n' nicht an einem Stück senden muss, sondern bei Dir auch bei einem `recv()`-Aufruf 'test\nte' und beim nächsten dann erst 'st1\n' ankommen kann. Es ist nicht wirklich garantiert, dass die Zeilen immer an einem Stück ankommen.
Das mit dem `dict()` in `parse.run()` hat einmal den Vorteil, dass `run()` nicht so gross wird und zum zweiten kann man es dann leichter erweitern. Das ist ausserdem die "pythonische" Art eine ``switch``-Anweisung auszudrücken, die es in anderen Programmiersprachen gibt. Ich würde an der Stelle wohl einen dynamischen "dispatch" anhand von ``info[1]`` machen, sofern man davon ausgehen kann, dass für die Fälle, die man behandeln möchte, immer etwas steht, was als Suffix eines gültigen Namens in Python durchgeht. Ungetestet: http://paste.pocoo.org/show/161268/
Nur um sicher zu gehen: Du weisst, dass die `Thread`-Objekte solange existieren, bis sie durchgelaufen sind? Auch wenn man keine Referenzen mehr darauf hält. Solange das Hauptprogramm läuft, braucht man sich da nicht mehr weiter zu kümmern. Für das Verhalten wenn das Hauptprogramm endet und noch Threads laufen, ist `Thread.setDaemon()` auf den jeweiligen `Thread`-Exemplaren. verantwortlich.
Code: Alles auswählen
In [137]: socket.socket
Out[137]: <class 'socket._socketobject'>
Und ich versteh's immer noch nicht. Mir ist klar, dass man für verschiedene Ereignisse, die man Melden möchte, jeweils Objekte benötigt, die diese Verarbeiten, den Benutzer informieren, oder auch andere Aktionen auslösen. Aber warum muss man die in diese Dictionaries stecken? Warum mit Zufallszahlen als Schlüssel? Wie soll man da je wieder *gezielt* herankommen? Und wenn man das nicht kann, warum stecken die dann nicht einfach in Listen? Warum willst Du da später noch einmal drauf zugreifen? Gib doch mal bitte ein konkretes Beispiel.
Das mit `Thread` kann man so schreiben, aber ich würde in dem Fall die Schlüsselworte explizit hinschreiben, statt Platzhalterargumente anzugeben.
Code: Alles auswählen
In [141]: def say_hello(to):
.....: print 'Hello, %s!' % to
.....:
In [142]: t = threading.Thread(target=say_hello, args=['world'])
In [143]: t.start()
Hello, world!
Das Problem mit `recv()` ist, dass die Gegenseite 'test\ntest1\n' nicht an einem Stück senden muss, sondern bei Dir auch bei einem `recv()`-Aufruf 'test\nte' und beim nächsten dann erst 'st1\n' ankommen kann. Es ist nicht wirklich garantiert, dass die Zeilen immer an einem Stück ankommen.
Das mit dem `dict()` in `parse.run()` hat einmal den Vorteil, dass `run()` nicht so gross wird und zum zweiten kann man es dann leichter erweitern. Das ist ausserdem die "pythonische" Art eine ``switch``-Anweisung auszudrücken, die es in anderen Programmiersprachen gibt. Ich würde an der Stelle wohl einen dynamischen "dispatch" anhand von ``info[1]`` machen, sofern man davon ausgehen kann, dass für die Fälle, die man behandeln möchte, immer etwas steht, was als Suffix eines gültigen Namens in Python durchgeht. Ungetestet: http://paste.pocoo.org/show/161268/
Nur um sicher zu gehen: Du weisst, dass die `Thread`-Objekte solange existieren, bis sie durchgelaufen sind? Auch wenn man keine Referenzen mehr darauf hält. Solange das Hauptprogramm läuft, braucht man sich da nicht mehr weiter zu kümmern. Für das Verhalten wenn das Hauptprogramm endet und noch Threads laufen, ist `Thread.setDaemon()` auf den jeweiligen `Thread`-Exemplaren. verantwortlich.