The joys of Python

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Volker Gietz

    The joys of Python

    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(UserLi st):
    def __init__(self):
    UserList.__init __(self)
    self.append = Channel(self.ap pend)
    self.extend = Channel(self.ex tend)

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

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


    And this allows for automatic peer-to-peer list synchronisation :
    [color=blue][color=green][color=darkred]
    >>> l1 = SyncList()
    >>> l2 = SyncList()
    >>> l2.join(l1)
    >>> l1.append(1)
    >>> l1.extend((2, 3, 4))
    >>> l1[/color][/color][/color]
    [1, 2, 3, 4][color=blue][color=green][color=darkred]
    >>> l2[/color][/color][/color]
    [1, 2, 3, 4][color=blue][color=green][color=darkred]
    >>> l1 is l2[/color][/color][/color]
    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(it ems)

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

    ... 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



Working...