[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