3
from cpython.number cimport PyNumber_InPlacePower
6
# As far as DW can tell, calling through this C API call is the
7
# only way to actually use ternary __ipow__
8
return PyNumber_InPlacePower(a, b, c)
10
# three-arg ipow can only work safely on Py3.8+
11
# and so tests are in a separate file
13
cdef class TwoOrThreeArgIPow:
15
>>> a = TwoOrThreeArgIPow('a')
19
>>> print(ipow(TwoOrThreeArgIPow('a'), 'x', 'y'))
24
def __init__(self, name):
27
def __ipow__(self, other, base=None):
28
return f"{self.name}**{other}[{base}]"
31
cdef class ThreeArgIPow:
33
Note that it's not possible to detect if this is called in a 2-arg context
34
since the Python interpreter just passes None
35
>>> a = ThreeArgIPow('a')
39
>>> print(ipow(ThreeArgIPow('a'), 'x', 'y'))
44
def __init__(self, name):
47
def __ipow__(self, other, base):
48
return f"{self.name}**{other}[{base}]"