[PyQt] SIP 4.8: regression in div/truediv
Phil Thompson
phil at riverbankcomputing.co.uk
Sat Jul 25 17:24:51 BST 2009
On Sat, 25 Jul 2009 03:34:38 +0200, Giovanni Bajo <rasky at develer.com>
wrote:
> On Fri, 24 Jul 2009 22:53:23 +0100, Phil Thompson
> <phil at riverbankcomputing.co.uk> wrote:
>> On Fri, 24 Jul 2009 20:43:10 +0200, Giovanni Bajo <rasky at develer.com>
>> wrote:
>>> Hello,
>>>
>>> I'm wrapping with SIP a global C++ operator/() overload, whose first
>>> argument is a SIP-wrapped class (within the same module).
>>>
>>> With SIP 4.7, this function is called when I use "/" in Python, both
>>> with standard division behaviour and within modules using "from
>>> __future__ import division".
>>>
>>> With SIP 4.8, this function is called only within modules with standard
>>> division behaviour. If a module uses the future directive, using "/" in
>>> Python raises an exception saying that there is no valid operand types.
>>>
>>> I believe that the problem is that the truediv_slot of the object is
not
>
>>> being filled. Is this a wanted change in behaviour? And if so, how am I
>>> supposed to fix it?
>>
>> "/" is the same as __div__. Define __truediv__ for true division.
>
> I'm not sure that's a good choice for a default. "/" in Python maps to
> __div__ in 2.x and __truediv__ in 3.x by default, but the future
statement
> is meant as an aid for the transition. So it's weird in SIP that simply
> declaring something like:
>
> Foo operator/(Foo f, int x);
>
> works with Python's "/" in 2.x and 3.x, but *not* when using the
transition
> aid.
>
> I believe that "operator/" should map to both the __div__ and the
> __truediv__ slot in Python 2.x. People that want to export a finer
> granularity to Python (and I believe that it is highly unlikely, given
that
> C++ itself does not have it in the first place) could do with a
> /ClassicDivOnly/ annotation, or by simply manually defining __div__ and
> __truediv__ instead of using "operator/".
>
> Plus, it's a a change in behaviour from SIP 4.7 :)
Actually "operator/" is completely broken for Python v3. Should all be
fixed in tonight's snapshot - with the 4.7 behavior for Python v2.
Phil
More information about the PyQt
mailing list