[C++-sig] Miscellaneous Boost.Python Utilities

Brian O'Kennedy brokenn at gmail.com
Wed Jul 6 12:56:39 CEST 2011


Hi Jim,

I've been trying out your python extensions and find them very useful
to ease the wrapping process. I did however find a problem with the
behaviour of the container_from_python_sequence converter.

When having two overloaded functions, one of which expects a container
of TestObjects and the other a single TestObject, I get this error in
Python when calling the overloaded function with a single TestObject.
  TypeError: object of type 'TestObject' has no len()
This is due to the use of the len() function on a non-sequence in the
'convertible' method of container_from_python_sequence.

The other issue is that the type of objects in the sequence is only
checked if the sequence has more-than-one item, and not when it only
contains one. I've made a couple of changes, included in the patch
below.

(A) Check if the input is in fact a sequence.
(B) Check the contained type when the sequence length is non-zero

Cheers
 Brian


-----------------container.hpp----------------------------------
@@ -37,8 +37,10 @@
struct container_from_python_sequence {

static void* convertible(PyObject * obj) {
         try {
+            if (!PySequence_Check(obj))
+              return NULL;
             object sequence(handle<>(borrowed(obj)));
-            if (len(sequence) > 1) {
+            if (len(sequence) > 0) {
                 if (!extract<Value>(sequence[0]).check())
                     return NULL;
             }
---------------------------------------------------------

On 14 May 2010 01:53, Jim Bosch <talljimbo at gmail.com> wrote:
>
> In the hope that others might find them useful, and perhaps contribute some of their own, I've posted a collection of miscellaneous Boost.Python extensions I've been using at the Boost sandbox:
>
> http://svn.boost.org/svn/boost/sandbox/python_extensions
>
> Features include:
>
> - Conversions between STL containers and Boost.Range iterator ranges and Python builtins like list, tuple, and dict.
>
> - Conversions between Boost.Fusion sequences and Python tuples.
>
> - A third solution to the const shared_ptr problem (see http://language-binding.net/pyplusplus/troubleshooting_guide/shared_ptr/shared_ptr.html) that isn't evil (I don't think) and doesn't involve changing the Boost.Python library itself - it simply doesn't use register_ptr_to_python to register the conversion.
>
> More info is available in the README file.
>
> Also, I'm sure many of the regulars on this list have their own similar extensions, and I'd love to see them collected in one place.  If you'd like to add your collection to mine, or have a suggestion for some other place I should put my collection, please let me know.  I would like to limit this collection to simple things that don't depend on non-Boost libraries, however.
>
>
> Jim Bosch
> _______________________________________________
> Cplusplus-sig mailing list
> Cplusplus-sig at python.org
> http://mail.python.org/mailman/listinfo/cplusplus-sig


More information about the Cplusplus-sig mailing list