Dennis Kempin wrote: > Chris schrieb: >> On Feb 12, 9:38 pm, Dennis Kempin <[EMAIL PROTECTED]> wrote: >>> Hello, >>> >>> I have a set of some objects. With these objects I want to call a Python >>> method. But the writer of the method shall have the option to select >>> from these objects as method parameter. >>> >>> At the moment i use the following way to call a method with the a or b >>> or both parameter. >>> >>> try: >>> method(a=value) >>> except TypeError: >>> try: >>> method(b=value) >>> except TypeError: >>> method(a=value, b=value) >>> >>> This is getting really complex the more optional parameters I want to >>> provide. >>> Is there any other way to access the method parameter? >>> >>> Thanks in advance, >>> Dennis >> >> Instead of having set variable names, why not pass a dictionary ? > > well of course it is possible that way. but it is not that.. "nice". > I have a really a big bunch of functions that can access about 10 > parameters. > at the moment i am using this alternative: > > def method(paramA, paramB, paramC, **unused): > > and the method is called via method(**params) > >> def method(**kwargs): >> print kwargs >> >> method(a='test1') >> {'a': 'test1'} >> >> method(a='test1', b='test2') >> {'a': 'test1', 'b': 'test2'} >> >> You can unpack the args once you are in your method to determine what >> you need to do. > that is the problem.. the most methods have only about 2-3 lines, it > would get annoying when you always have to unpack the values.. > > thanks, > Dennis
Maybe you like import inspect def format(kw): return ", ".join("%s=%r" % (key, kw[key]) for key in sorted(kw)) def dispatch(**kw): try: f = _funcs[tuple(sorted(kw))] except KeyError: raise TypeError("Don't know what to do with %s" % format(kw)) else: return f(**kw) _funcs = {} def register(f): args = tuple(sorted(inspect.getargspec(f)[0])) if args in _funcs: raise ValueError _funcs[args] = f return f @register def add(a, b): return a + b @register def inv(a): return -a @register def square(b): return b*b if __name__ == "__main__": print "1+2 =", dispatch(a=1, b=2) print "-3 =", dispatch(a=3) print "4*4 =", dispatch(b=4) print "oops", dispatch(c=5) dispatch() uses argument names to choose a function it invokes. Peter -- http://mail.python.org/mailman/listinfo/python-list