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 :wink:
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 :D

Verfasst: Samstag 25. August 2007, 19:24
von veers
EyDu hat geschrieben:Ist ja auch keine Listcomprehension sondern ein Generator-Ausdruck :D
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