[PySide] Shiboken-generated __nonzero__() methods and truth value testing

Matthew Woehlke matthew.woehlke at kitware.com
Mon Sep 23 19:20:26 CEST 2013


On 2013-09-22 16:46, John Tourtellott wrote:
> I am using Shiboken to wrap a small class library. In my typesystem.xml
> file, I have added a __nonzero__() method to some of the classes using the
> <add-function> element. The method gets generated OK and I can call it from
> python, however, python is *not* calling the Shiboken-generated
> __nonzero__() method when doing truth value testing, for example, in an "if
> object:" expression.
>
> Looking briefly at the Shiboken source, in particular,
> CppGenerator::hasBoolCast(), I get the impression that I *must* use the
> --use-isnull-as-nb_nonzero command-line option in order to get the expected
> boolean value. My tests further indicate that this option only applies to
> isNull() methods that are implemented in the C++ classes, not added via the
> typesystem file. Is this correct?

According to 
http://stackoverflow.com/questions/9828822/how-should-nonzero-be-implemented-using-the-python-c-api, 
type customizations like this never use "normal" functions, but must use 
the nb_* members of the cpython object structure.

Do I guess there are a few options:

1. Add a C++ isNull().
2. Modify Shiboken to allow specifying the name of the nb_bool method. 
(Still must implement it in C++)
3. Modify Shiboken to recognize typesystem-added functions for nb_bool.
4. Modify Shiboken to (preferentially?) recognize __nonzero__ as the 
nb_bool method (likely in combination with (3)).

(2), (3) and (4) are more or less orthogonal; there would be benefit to 
implementing all of them.

I happen to know that (1) is not feasible in our case, as the class in 
question is an STL class.

-- 
Matthew




More information about the PySide mailing list