Is this considered black magic?

Brad Bollenbach bbollenbach at home.com
Sun Nov 11 16:59:05 CET 2001


"Laura Creighton" <lac at strakt.com> wrote in message
news:mailman.1005485895.7082.python-list at python.org...
> I want to do something which is conceptually very simple.  Given a list of
> objects, call make everybody call the same method you want to run.  Sort
> of like apply(), but for methods.

apply() is made for methods as well. All it cares about is that you pass it
a callable object as its first argument. Whether said callable object is
foo, or x.foo is irrelevant. Either one is callable.

> This is what I came up with:
>
> 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)
>
> def foreach(name_key, object_list, *args):
>     print 'foreach: args are ' + `args`
>     for object in object_list:
>         try:
>             object.__class__.__dict__[name_key](object, *args)
>         except KeyError:
>             pass
>
> ##########################
> if __name__ == '__main__':
>
>     h=Ham()
>     e=Eggs()
>     s=Spam()
>
>     foreach ('say', [h, e, s])
>
>     foreach('speak_up', [e])
>     foreach('speak_up', [h, e, s], 'sandwich')
>     foreach('speak_up', [h, e, s], None) #can i pass None?
>
>     foreach('shout', [h, e, s], 'sandwich')
>     foreach('shout', [h, e, s], 'sandwich', 'beer')
> --------------
>
> This works:

Indeed, but doesn't buy you much over a simple:

for x in [h, e, s]:
     try:
        x.speak_up()        # or apply(x.speak_up, (args, go, here)) if
you're so inclined.
     except AttributeError:
        pass

etc.

> foreach: args are ()
> I am Ham, and I don't want any arguments, thank you.
> foreach: args are ()
> I am Eggs, and my arguments are bacon
> foreach: args are ('sandwich',)
> I am Ham, and my arguments are sandwich
> I am Eggs, and my arguments are sandwich
> foreach: args are (None,)
> I am Ham, and my arguments are None
> I am Eggs, and my arguments are None
> foreach: args are ('sandwich',)
> I AM SPAM AND MY ARGUMENTS ARE sandwich AND sausage
> foreach: args are ('sandwich', 'beer')
> I AM SPAM AND MY ARGUMENTS ARE sandwich AND beer
> ----------------
>
> But is it white, grey, or black magic?  Is there a better way I should
have
> done?  Suggestions on what to name the function gratefully welcomed.
>
> Laura Creighton

Hope that helps,

Brad





More information about the Python-list mailing list