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