in-place exponentiation incongruities

Steven D'Aprano steve+comp.lang.python at pearwood.info
Sun Aug 12 07:03:08 EDT 2012


On Sun, 12 Aug 2012 00:14:27 -0700, Giacomo Alzetta wrote:

> From The Number Protocol(http://docs.python.org/c-api/number.html). The
> full text is:
> 
> PyObject* PyNumber_InPlacePower(PyObject *o1, PyObject *o2, PyObject
> *o3)
>     Return value: New reference.
> 
>     **See the built-in function pow().** Returns NULL on failure. The
>     operation is done in-place when o1 supports it. This is the
>     equivalent of the Python statement o1 **= o2 when o3 is Py_None, or
>     an in-place variant of pow(o1, o2, o3) otherwise. If o3 is to be
>     ignored, pass Py_None in its place (passing NULL for o3 would cause
>     an illegal memory access).
> 
> The first thing that this text does is referring to the **function**
> pow, which takes three arguments. And since the documentation of the
> operator module states that "The operator module exports a set of
> efficient functions corresponding to the intrinsic operators of
> Python.", I'd expect the ipow to have three arguments, the third being
> optional.

Why? There is no three-argument operator. There is a three-argument 
function, pow, but you don't need the operator module for that, it is 
built-in. There is no in-place three-argument operator, and no in-place 
three-argument function in the operator module.

Arguing from "consistency" is not going to get you very far, since it is 
already consistent:

In-place binary operator: **=
In-place binary function: operator.ipow

In-place three-argument operator: none
In-place three-argument function: none

If you decide to make a feature-request, you need to argue from 
usefulness, not consistency.

http://bugs.python.org

Remember that the Python 2.x branch is now in feature-freeze, so new 
features only apply to Python 3.x.


> With normal exponentiation you have ** referring to the 2-argument
> variant, and "pow" providing the ability to use the third argument. 

Correct.


> At the moment in-place exponentiation you have "**=" referring to the
> 2-argument variant(and this is consistent), while operator.ipow also
> referring to it. 

Correct. Both **= and ipow match the ** operator, which only takes two 
arguments.


> So providing an ipow with the third argument would just
> increase consistency in the language, 

Consistency with something other than **=  would be inconsistency.



> and provide a feature that at the
> moment is not present. (well if the designers of python care really much
> about consistency they'd probably add an "ipow" built-in function, so
> that you don't have to import it from "operator").

Not everything needs to be a built-in function.



-- 
Steven



More information about the Python-list mailing list