[C++-sig] boost::python overload resolution redux

troy d. straszheim troy at resophonic.com
Thu Dec 3 22:17:40 CET 2009


troy d. straszheim wrote:
> 
> That doesn't work for pure python functions either:
> 
>  >>> def f(x,y,z): return x*100 + y*10 + z
> ...
>  >>> from functools import partial as p
>  >>> p(f,x=1)(2,3)
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
> TypeError: f() got multiple values for keyword argument 'x'
>  >>> p(f,x=1)(y=2,z=3)
> 123
>  >>> p(f,1)(2,3)
> 123
> 
> The error message is misleading for sure.  Boost.python is going through 
> a list of overloads and trying them in order; if it runs out of 
> overloads, it says nothing matched.  I think I can get it to be smarter 
> about this, lemme see...
> 

Trac ticket here:  https://svn.boost.org/trac/boost/ticket/3710

For the record, here's a variation on the same theme.  It doesn't have 
anything to do with functools, it is another symptom of our first-match 
overload resolution algorithm:

int addem(int x, int y, int z) { return x*100 + y*10 + z; }

BOOST_PYTHON_MODULE(functools_playnice_ext)
{
   def("addem", &addem, (arg("x"), arg("y"), arg("z")));
}


 >>> from functools_playnice_ext import addem
 >>> addem(1, 8, 2, x=4)
Traceback (most recent call last):
...
ArgumentError: Python argument types in
     functools_playnice_ext.addem(int, int, int)
did not match C++ signature:
     addem(int x, int y, int z)


I've been thinking about this off and on for a while, to fix it right 
isn't trivial.  I could put in a few checks for cases where a function 
is not overloaded, but that feels like hackery.


-t






More information about the Cplusplus-sig mailing list