converting from perl: variable sized unpack

Alex Martelli aleaxit at yahoo.com
Mon Jul 16 17:17:13 CEST 2001


"Roy Smith" <roy at panix.com> wrote in message
news:9iuq95$3e0$1 at panix6.panix.com...
> Alex Martelli <aleaxit at yahoo.com> wrote:
> > I find I can rarely throw away the match-objects in this cavalier
> > way, because they carry much, often-needed information -- so, I
    ...
> No it's not, but the problem is not that match returns None, the
> problem is that Python doesn't allow assignment as a side effect.

If I wanted "assignment as a side effect" it would of course be
trivial for me to code it.  I far prefer to have failure be
signaled by exceptions -- a much more general & solid idiom.

> Imagine if you could write it this way:
>
>     if mo = re1.match(thestring)
>         dostuff(mo)
>     elif mo = re2.match(thestring)
>         dootherstuff(mo)
>     elif mo = re3.match(thestring)
>         etcetcetc(mo)
>     else:
>         nomatchatall()
>
> Wouldn't that be elegant and clean and obvious?
>
> After 4 years of using Python, I still find the lack of any way to do
> an atomic "assign and test" unbelievably constraining.

Surely you ARE jesting, right?  After (I believe it was) four DAYS of
Python, I had already placed in my sitecustomize.py the few lines
(just typing them from memory now, as I've since removed them):

    class DataHolder:
        def __init__(self, value=None): self.value = value
        def set(self, value): self.value = value; return value
        def get(self): return self.value
    setattr(__builtins__,'DataHolder',DataHolder)
    setattr(__builtins__,'data',DataHolder())

to help me transliterate some existing C and Perl code which used
what you call "atomic assign and test" -- a q&d hack until I could
find the time to do it more Pythonically (and, actually, LEARN the
Pythonic ways of doing things -- after four days, it was clear to
me that I had not yet mastered them:-).  So, IF I considered it
elegant to set something and test it too, I could easily code, e.g:

   if data.set(re1.match(thestring))
       dostuff(data.get())
   elif data.set(re2.match(thestring))
       dootherstuff(data.get())
   elif data.set(re3.match(thestring))
       etcetcetc(data.get())
   else:
       nomatchatall()

So far, so obvious, I hope -- whence my near-certainty that
your bemoaning a 'lack' so trivially fixed as 'unbelievably
constraining' must be some kind of deadpan humor whose point
I'm missing -- if half a dozen lines in sitecustomize.py are
all it takes to eliminate something "unbelievably constraining",
how believable is it that one's really feeling constrained?-)

Hmmm, maybe I should write this up as a Cookbook entry (not
that there's much to write about...), just so I can give a
pointer to it in the future rather than typing it in again
and again on each such discussion...:-).  Done -- see
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66061


Alex






More information about the Python-list mailing list