On 8/12/2012 7:55 AM, Giacomo Alzetta wrote:

What I mean is: when you implement a new type as a C extension you
have to provide special methods through the NumberMethods struct. In
this struct both the power and in-place power operations have three
arguments.

I am not really sure why the latter is true. Probably 'consistency' at the special method level, with __pow__. As Steven points out, it is not needed to implement normal Python code.

This is one area of Python where the design is a bit messy. I believe the very existence of __ipow__ is a matter of consistency than of known use cases. Guido was not sure which __ixxx__ would ever be needed (for mutable objects), so he just put them all in.

At the Python level, both __pow__ and __ipow__ are also documented in the manual as having an optional, third, modulo parameter. __rpow__ is defined as binary, but that is a mistake

>>> int.__rpow__(3, 5, 4)
1


Now, suppose I implement the three argument variant of the
in-place power in a class.

Are you actually planning to do this, or is this purely theoretical?

No user would be able to call my C
function with a non-None third argument,

Not true. Whether the function is coded in Python or C
cls.__ipow__(base, exp, mod) # or
base.__ipow__(exp, mod)

while he would be able to
call the normal version with the third argument.

That can also be done directly
>>> int.__pow__(5, 3,  4)
1

--
Terry Jan Reedy

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to