[Python-ideas] Is there a reason some of the PyLong_As* functions don't call an object's __int__?
Erik Bray
erik.m.bray at gmail.com
Fri Dec 8 05:41:10 EST 2017
IIUC, it seems to be carry-over from Python 2's PyLong API, but I
don't see an obvious reason for it. In every case there's an explicit
PyLong_Check first anyways, so not calling __int__ doesn't help for
the common case of exact int objects; adding the fallback costs
nothing in that case.
I ran into this because I was passing an object that implements
__int__ to the maxlen argument to deque(). On Python 2 this used
PyInt_AsSsize_t which does fall back to calling __int__, whereas
PyLong_AsSsize_t does not.
Currently the following functions fall back on __int__ where available:
PyLong_AsLong
PyLong_AsLongAndOverflow
PyLong_AsLongLong
PyLong_AsLongLongAndOverflow
PyLong_AsUnsignedLongMask
PyLong_AsUnsignedLongLongMask
whereas the following (at least according to the docs--haven't checked
the code in all cases) do not:
PyLong_AsSsize_t
PyLong_AsUnsignedLong
PyLong_AsSize_t
PyLong_AsUnsignedLongLong
PyLong_AsDouble
PyLong_AsVoidPtr
I think this inconsistency should be fixed, unless there's some reason
for it I'm not seeing.
Thanks,
Erik
More information about the Python-ideas
mailing list