Is this considered black magic?

Achim Domma achim.domma at syynx.de
Sun Nov 11 17:25:22 CET 2001


Hi,

I would try to put your foreach in a class :

-----------------------
class Ham:
    def say(self):
        print "I am Ham, and I don't want any arguments, thank you."

    def speak_up(self, arg):
        print 'I am Ham, and my arguments are %s' % arg

class Eggs:
    def speak_up(self, arg='bacon'):
        print 'I am Eggs, and my arguments are %s' % arg

class Spam:
    def shout(self, arg1, arg2='sausage'):
        print 'I AM SPAM AND MY ARGUMENTS ARE %s AND %s' % (arg1, arg2)



class FktCall:
    def __init__(self,name,fkt):
        self.name = name
        self.fkt = fkt

    def __call__(self,*args):
        return self.fkt(self.name,*args)

class ClusteredCall:
    def __init__(self,*items):
        self.items = items

    def do_foreach(self,name_key,*args):
        for o in self.items:
            try:
                getattr(o, name_key)(*args)
            except AttributeError:
                pass

    def __getattr__(self,attr):
        return FktCall(attr,self.do_foreach)


##########################
if __name__ == '__main__':

    cluster = ClusteredCall(Ham(),Eggs(),Spam())

    cluster.shout('sandwich')
    cluster.speak_up('test')

-----------------------

I'm no Python Expert and don't know how much performance you loose due to
the extra level of indirection. But in my opinion the client code (i.e.
cluster.shout(...)) is much more readable this way.

greetings
Achim





More information about the Python-list mailing list