Bewertung meines ersten ernst gemeinten Python-Codes
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
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 (former) Modvoice
`any()` gibt's ab Python 2.5 als eingebaute Funtkion, dann braucht man sich die nicht mehr selber definieren.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.
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
`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 True in imap(bool, iterable)
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.Code: Alles auswählen
return any(test(address) for test in (has_maildir, is_forward_address, is_alias))
Ja.Und müsste das nicht
heißen?Code: Alles auswählen
localpart[len(domain) + 1:]
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.Achso, das mit is_forward_address() stimmt soweit schon.
Üüüüüberhaupt nicht. Ich hasse Python. Und bin Masochist.Man könnte fast meinen, ihr hättet Spaß an Python
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.
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.
Ich habe es befürchtetÜüüüüberhaupt nicht. Ich hasse Python. Und bin Masochist.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
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.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
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice