The joys of Python

Volker Gietz look at sig.please
Fri Apr 2 03:32:12 EST 2004


Hello all,

I have been using Python for almost a year now and by now I do 95% of my
programming in it except some DSP stuff in C++. I learnt Python's basics
in one week, yet the language still amazes me every day. Elegant
solutions just keep cropping up everywhere, it must be one of these
brain-impedance matches I suppose :-)

Yesterday I came up with this:

   class Channel:
       ## Acts as a function call wrapper, a call to one instance
       ## calls all other wrapped functions on the (broadcast) channel
       def __init__(self, func, other=None):
           self.all = (other and other.all) or []
           self.all.append(self)
           self.func = func

       def __call__(self, *args):
           for item in self.all:
               item.func(*args)

       ## join other channel ("tune in")
       def join(self, other):
           self.all.remove(self)
           self.all = other.all
           self.all.append(self)


Now I can easily create:

   from UserList import UserList

   class SyncList(UserList):
       def __init__(self):
           UserList.__init__(self)
           self.append = Channel(self.append)
           self.extend = Channel(self.extend)

       def __repr__(self):
           return repr(self.data)

       ## synchronise to other list
       def join(self, other):
           self.append.join(other.append)
           self.extend.join(other.extend)


And this allows for automatic peer-to-peer list synchronisation:

>>> l1 = SyncList()
>>> l2 = SyncList()
>>> l2.join(l1)
>>> l1.append(1)
>>> l1.extend((2, 3, 4))
>>> l1
[1, 2, 3, 4]
>>> l2
[1, 2, 3, 4]
>>> l1 is l2
False
    qed :)

Of course, all mutating methods need to be wrapped. The "classic"
approach would have been to have one conrete broadcaster and do

   def append(self, items):
       for child in self.children:
           child.append(items)

   def extend(self, items):
       for child in self.children:
           child.extend(items)

   ... yawn!


Bottom line is, I like Python a lot! It is certainly the bright side of
coding.

Cheers,
    Volker

________________________________________________________________________
            ___
    e-mail:  |alphir at \/\/eb.de






More information about the Python-list mailing list