[Python-de] Zuweisungen bei if?
Thomas Rachel
nutznetz-0c1b6768-bfa9-48d5-a470-7603bd3aa915 at spamschutz.glglgl.de
Di Apr 10 14:32:55 CEST 2012
Am 10.04.2012 11:59 schrieb Ulli Horlacher:
> Weil meine Programme exzessiv regexp und backreferences verwenden, hab ich
> mir jetzt eine Funktion dafuer geschrieben:
>
> def match(x,s,f=None):
> global _
> _ = [ '' ]
> if f:
> m = re.search(x,s,flags=f)
> else:
> m = re.search(x,s)
>
> if m and m.groups: _.extend(m.groups())
> return m
>
>
> Damit kann ich jetzt wie gewohnt in einer Zeile eine Abfrage machen:
>
> if len(sys.argv)>1 and match(r"(x+)",sys.argv[1],re.I): print _[1]
Offen gesagt, schön ist anders. gettext.py macht es allerdings
vergleichbar (_ zweckentfremden, um zum Vorbildprodukt kompatibel zu
bleiben) Dort ists allerdings noch wüster, weil AFAIR __builtins__
verändert wird, da es andernfalls Probleme gibt, wenn Du match in ein
Modul auslagen willst.
Ein klein wenig schöner wäre es, die benutzte Liste als Attribut von
match zu speichern:
def match(x,s,f=None):
match.groups = [ '' ]
if f:
m = re.search(x,s,flags=f)
else:
m = re.search(x,s)
if m and m.groups: match.groups.extend(m.groups())
return m
if len(sys.argv)>1 and match(r"(x+)",sys.argv[1],re.I):
print match.groups[1]
Ansonsten fällt mir allerdings gerade keine andere Möglichkeit ein,
abgesehen von einer klassenbasierten Herangehensweise, so in etwa:
class Matcher(object):
def __init__(self, source):
self.source = source
def match(self, rx, flags=0):
self.groups = ['']
if self.source is not None:
m = re.search(rx, self.source, flags=flags)
self.groups.extend(m.groups())
else:
m = None
return m
class ArgvMatcher(Matcher):
def __init__(self, index):
if len(sys.argv) > index:
self.source = sys.argv[index]
else:
self.source = None
m = ArgvMatcher(1)
if m.match(r"(x+)", re.I): print m.groups[1]
(ungetestet)
Ok, 2 Zeilen - aber IMHO ein *klein* wenig besser...
Thomas
Mehr Informationen über die Mailingliste python-de