On Oct 14, 5:00 pm, "Aaron \"Castironpi\" Brady" <[EMAIL PROTECTED]> wrote: > On Oct 14, 2:32 pm, George Sakkis <[EMAIL PROTECTED]> wrote: > > > > > On Oct 14, 2:35 pm, "Aaron \"Castironpi\" Brady" > > > <[EMAIL PROTECTED]> wrote: > > > On Oct 14, 9:42 am, George Sakkis <[EMAIL PROTECTED]> wrote: > > > > > On Oct 14, 3:06 am, "Gabriel Genellina" <[EMAIL PROTECTED]> > > > > wrote: > > > > > > En Fri, 10 Oct 2008 14:18:53 -0300, Aaron "Castironpi" Brady > > > > > <[EMAIL PROTECTED]> escribió: > > snip > > > > > > You are wrapping a function with this signature: > > > > > > > def f( a, b, c= None, *d, **e ): > > > > > > > You want to find out the values of 'a', 'b', and 'c' in a decorator. > > > > > > You have these calls: > > > > > > > f( 0, 1, 'abc', 'def', h= 'ghi' ) > > > > > > f( 0, 1 ) > > > > > > f( 0, 1, h= 'abc' ) > > > > > > f( 0, 1, 'abc', c= 'def' ) #raise TypeError: multiple values > > > > > > > How do you determine 'a', 'b', and 'c'? > > > > > > I'm afraid you'll have to duplicate the logic described here: > > > > > http://docs.python.org/reference/expressions.html#id9 > > > > > To my knowledge, there is no available Python code (in the stdlib or > > > > > something) that already does that. > > > > > I wrote such a beast some time ago; it's hairy but to the best of my > > > > knowledge it seems to reproduce the standard Python > > > > logic:http://code.activestate.com/recipes/551779/ > > > > > George > > > > I didn't see a 'got a duplicate argument for keyword "d"' error, but I > > > can add one if I need to. > > > Why don't you try it out: > > > >>> def f( a, b, c= None, *d, **e ): pass > > >>> getcallargs(f, 0, 1, 'abc', c= 'def' ) > > > Traceback (most recent call last): > > File "<stdin>", line 1, in <module> > > File "getcallargs.py", line 53, in getcallargs > > "argument '%s'" % (f_name,arg)) > > TypeError: f() got multiple values for keyword argument 'c' > > > George > > Excellent. > > Here's some more info. > > Ver 2.5: > > >>> f( c= 0, c= 0 ) > > Traceback (most recent call last): > File "<stdin>", line 1, in <module> > TypeError: f() got multiple values for keyword argument 'c'>>> getcallargs( > f, c= 0, c= 0 ) > > Traceback (most recent call last): > File "<stdin>", line 1, in <module> > File "<stdin>", line 64, in getcallargs > TypeError: f() takes at least 2 non-keyword arguments (0 given) > > Just the wrong order to check errors in.
The problem is getcallargs doesn't even see the double entry; if you print (args, kwds) from within getcallargs you get ((), {'c': 0}). The SyntaxError raised in 2.6 is more reasonable. George -- http://mail.python.org/mailman/listinfo/python-list