Geht das eleganter

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.
Antworten
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

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
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

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]:
    ....
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

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
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

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.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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
>>> 
Zuletzt geändert von EyDu am Samstag 25. August 2007, 17:47, insgesamt 1-mal geändert.
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.
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Ich dachte Listcomprehensions werden in Listen verwandelt und nicht in Generatoren. Ist ja richtig toll so :)
Vielen Dank!

Blackjack, die Liste ist Userdefinierbar ;)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Ist ja auch keine Listcomprehension sondern ein Generator-Ausdruck :D
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

EyDu hat geschrieben:Ist ja auch keine Listcomprehension sondern ein Generator-Ausdruck :D
Ah! Sehen sich ja ziemlich ähnlich :)
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

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
Antworten