Bewertung meines ersten ernst gemeinten Python-Codes

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Samstag 3. März 2007, 17:27

Der Doppelpunkt steht für die Slice-Syntax: slicebares_objekt[startpunkt:endpunkt:schrittweite]. Wenn man Werte auslässt werden Defaultwerte benutzt, d.h. Startpunkt liegt am Anfang, Endpunkt am Ende und die Schrittweite beträgt 1. Man kann ebenso auch negative Werte benutzen, zum Beispiel slicebares_objekt[:-1] welches ein Slice von Anfang bis zum vorletzten Element zurückgibt.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
BlackJack

Beitragvon BlackJack » Samstag 3. März 2007, 18:05

dst hat geschrieben:Da sind einige Kniffe drin, die mich wirklich weiterbringen, auch wenn ich gestehen muss teilweise leichte Verständnisprobleme zu haben, hauptsächlich, was die any-Funktion angeht.


`any()` gibt's ab Python 2.5 als eingebaute Funtkion, dann braucht man sich die nicht mehr selber definieren. :-)

Die Funktion bekommt ein "iterable" und gibt `True` zurück falls irgendein Element davon "Wahr" ist. Sobald so ein Element gefunden ist, werden die folgenden Elemente nicht mehr getestet, das bricht also ab sobald das Ergebnis feststeht, genau wie ``a or b or c or ...`` auch nur soweit ausgewertet wird, bis das Ergebnis sich nicht mehr ändern kann

Code: Alles auswählen

return True in imap(bool, iterable)


`imap()` bekommt eine Funktion und ein "iterable" und liefert ein "iterable" über die Elemente des zweiten Arguments, wobei auf jedes Element die Funktion angewendet wurde. In diesem Fall erhält man also für jedes ursprüngliche Element `True` oder `False`, je nachdem was ``bool(element)`` ergibt. Und mit dem ``in``-Operator wird geprüft ob `True` vorkommt, also ob irgendein Element wahr ist.

Code: Alles auswählen

    return any(test(address) for test in (has_maildir,
                                          is_forward_address,
                                          is_alias))


Hier werden die drei Testfunktionen nacheinander auf `address` angewendet und mit `any()` geprüft, ob eine davon `True` ergibt. Das in den Klammern von `any()` ist eine "generator expression", was dazu führt, dass dieser Test "lazy" ausgeführt wird weil `any()` die Ergebnisse nur solange konsumiert bis `True` auftaucht. Wenn also der erste Test schon erfolgreich ist, werden die restlichen nicht mehr ausgeführt.

Und müsste das nicht

Code: Alles auswählen

localpart[len(domain) + 1:]


heißen?


Ja. :oops:

Achso, das mit is_forward_address() stimmt soweit schon.


Bist Du Dir da sicher? Schau Dir die Logik nochmal genau an. Wenn es die Datei gibt, wird eigentlich grundsätzlich `True` zurückgegeben, ob nun eine passende Zeile in der Datei steht oder nicht. Das kann man dann auch kürzer schreiben indem man einfach nur prüft, ob die Datei vorhanden ist.

Man könnte fast meinen, ihr hättet Spaß an Python ;)


Üüüüüberhaupt nicht. Ich hasse Python. Und bin Masochist. ;-)
dst
User
Beiträge: 27
Registriert: Mittwoch 28. Februar 2007, 23:42

Beitragvon dst » Samstag 3. März 2007, 19:06

Das muss ich mir erstmal alles in Ruhe durch den Kopf gehen lassen.

is_forward_address() soll nur False zurückgeben, wenn in der Datei .qmail-$localpart kein gültiges lokales Postfach, keine Weiterleitung auf ein lokales Postfach (daher die Rekursion) und kein Programmaufruf drinsteht.
Da alles was keine E-Mail-Adresse ist, ein Programmaufruf oder eine lokale Mailbox sein dürfte, wird tatsächlich in den meisten Fällen True zurückgegeben.
Einfacher ausgedrückt, nur wenn die Datei ausschließlich externe Adressen enthält, soll False zurückgegeben werden. Soweit ich das sehe, sollte mit deiner Version funktionieren.
is_forward_address() ist dabei nicht der perfekte Name, aber das ist eher nebensächlich ;)

Ich werd jetzt erstmal ein bisschen mit Pydev für Eclipse rumspielen, vim ist, finde ich, nicht unbedingt der beste Editor, zum lernen einer Sprache ;)


P.S. Bei der imap()-Funktion habe ich mich etwas foppen lassen, irgendwie dachte ich da an das Protokoll und nicht an eine Iteratorfunktion ;)

P.P.S.
Üüüüüberhaupt nicht. Ich hasse Python. Und bin Masochist. ;-)

Ich habe es befürchtet ;)
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Sonntag 4. März 2007, 12:17

dst hat geschrieben:P.S. Bei der imap()-Funktion habe ich mich etwas foppen lassen, irgendwie dachte ich da an das Protokoll und nicht an eine Iteratorfunktion ;)

Ja, der Name ist etwas verwirrend, aber ``imap`` ist einfach die lazy-Version von ``map`` aus den Builtins und die anderen Funktionen in den Itertools die Generatoren neu implementieren fangen auch mit ``i`` an, damit man sie eben von den Builtins unterscheiden kann und damit sie beim Import keine Builtins überschreiben.
My god, it's full of CARs! | Leonidasvoice vs Modvoice

Wer ist online?

Mitglieder in diesem Forum: Baidu [Spider], Don Terremoto