[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.python

Dynamic method parameter access?

Dennis Kempin

2/12/2008 7:38:00 PM

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

3 Answers

Chris

2/12/2008 8:13:00 PM

0

On Feb 12, 9:38 pm, Dennis Kempin <den...@xardias.net> 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 ?

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.

Dennis Kempin

2/14/2008 7:01:00 PM

0

Chris schrieb:
> On Feb 12, 9:38 pm, Dennis Kempin <den...@xardias.net> 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

Peter Otten

2/14/2008 7:35:00 PM

0

Dennis Kempin wrote:

> Chris schrieb:
>> On Feb 12, 9:38 pm, Dennis Kempin <den...@xardias.net> 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