Seite 1 von 1
Geht das eleganter
Verfasst: Samstag 25. August 2007, 15:25
von veers
Kennt jemand von euch einen Weg folgenden Code schöner auszudrücken?
Code: Alles auswählen
for filename in os.listdir(path):
hidden = False
for hidden_file in self.hidden_files:
if hidden_file.match(filename):
hidden = True
break
if hidden:
continue
....
Gruss und dank,
Jonas
Verfasst: Samstag 25. August 2007, 15:59
von Joghurt
Sind hidden_files denn wirklich regexps?
Wenn es nur Strings sind, geht es auch so:
Code: Alles auswählen
for filename in [name for name in os.listpath(dir) if name not in self.hidden_files]:
....
Verfasst: Samstag 25. August 2007, 16:35
von veers
Ja, sonst könte ich ja ein einfaches if filename in self.hidden_files: continue verwenden
if filter(None, [exp.match(filename) for exp in self.hidden_files]): continue
wäre auch ein Weg, nur auch nicht wirklich elegant. Zudem werden immer alle Ausdrücke überprüft.
Ich denke das beste ist einen helper matches_any([regexps], str) zu schreiben.
Code: Alles auswählen
def matches_any(patterns, string):
for pattern in patterns:
match = pattern.match(string)
if match:
return match
Code: Alles auswählen
for filename in os.listdir(path):
if matches_any(self.hidden_files, filename):
continue
Verfasst: Samstag 25. August 2007, 16:58
von EyDu
Hier mal mein Vorschlag:
Code: Alles auswählen
for filename in os.listdir(path):
if any(hf.match(filename) for hf in self.hidden_files):
continue
Verfasst: Samstag 25. August 2007, 17:29
von veers
EyDu hat geschrieben:Hier mal mein Vorschlag:
Code: Alles auswählen
for filename in os.listdir(path):
if any(hf.match(filename) for hf in self.hidden_files):
continue
Sexy!
Bloss werden da auch alle ausdrücke immer ausgeführt.
Verfasst: Samstag 25. August 2007, 17:42
von EyDu
veers hat geschrieben:Bloss werden da auch alle ausdrücke immer ausgeführt.
Nein, werden sie nicht. Schau dir mal die Spezifikation von
any an. Die Auswertung des Generator-Ausdrucks wird sofort dann abgebrochen (durch any), wenn das erste Elemente mit dem Wert "True" gefunden wird. Zum Testen musst dir sonst einfach mal einen eigenen Generator schreiben:
Code: Alles auswählen
>>> def testgen():
print "TRUE..."
yield True
print "FALSE..."
yield FALSE
>>> any(testgen())
TRUE...
True
>>>
Verfasst: Samstag 25. August 2007, 17:46
von BlackJack
Alternative wäre vielleicht auch alle regulären Ausdrücke zu einem zusammenzufassen. Sofern keine benannten Gruppen oder Rückreferenzen enthalten sind die sich überschneiden, sollte das möglich sein.
Verfasst: Samstag 25. August 2007, 17:53
von veers
Ich dachte Listcomprehensions werden in Listen verwandelt und nicht in Generatoren. Ist ja richtig toll so
Vielen Dank!
Blackjack, die Liste ist Userdefinierbar
Verfasst: Samstag 25. August 2007, 17:55
von EyDu
Ist ja auch keine Listcomprehension sondern ein
Generator-Ausdruck
Verfasst: Samstag 25. August 2007, 19:24
von veers
Ah! Sehen sich ja ziemlich ähnlich
Verfasst: Sonntag 26. August 2007, 12:08
von HWK
Das wäre evtl. eine Alternative für die Nicht-Python-2.5-Benutzer (ungetestet):
Code: Alles auswählen
for filename in os.listdir(path):
if True in (bool(hf.match(filename)) for hf in self.hidden_files):
continue
MfG
HWK