V
Volker Gietz
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:
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
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:
Falsel1 = 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
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