Simulating call-by-reference

bonono at gmail.com bonono at gmail.com
Thu Nov 17 05:17:51 EST 2005


Rikard Bosnjakovic wrote:
> I'm tidying up some code. Basically, the code runs a bunch of
> regexp-searches (> 10) on a text and stores the match in a different variable.
>
> Like this:
>
>      re1 = r' ..(.*).. '
>      re2 = r' .... '
>      re3 = r' .(.*).. '
>      ...
>      m = re.search(re1, data)
>      if m:
>        myclass.bar = m.group(1)
>
>      m = re.search(re2, data)
>      if m:
>        myclass.foo = m.group(1)
>
>      m = re.search(re3, data)
>      if m:
>        myclass.baz = m.group(1)
>
>
> While this code works, it's not very good looking.
>
> What I want is to rewrite it to something like this:
>
>     l = [ (re1, myclass.bar),
>           (re2, myclass.foo),
>           (re3, myclass.baz),
>         ]
>
>     for (x,y) in l:
>       m = re.search(x, y)
>       if m:
>            y = m.group(1)
>
> But since Python doesn't work that way, that idea is doomed. What I'm
> looking for are other (better) ways or pointers to accomplish this task of
> cleanup.
> -----------------

I believe you can use the "setattr/getattr" call

l = [ (re1, myclass, "bar") ]

for x,y,z in l:
  m = re.search(x,getattr(y,z))
  if m: setattr(y,z,m.group(1))




More information about the Python-list mailing list