[Numpy-discussion] nditer as a context manager
Matti Picus
matti.picus at gmail.com
Thu Mar 22 13:37:03 EDT 2018
|Hello all, PR #9998 (https://github.com/numpy/numpy/pull/9998/) proposes
an update to the nditer API, both C and python. The issue (link) is that |||sometimes nditer uses temp arrays via the "writeback" mechanism, the
data is copied back to the original arrays "when finished". However
"when finished" was implemented using nditer deallocation. |This
mechanism is implicit and unclear, and relies on refcount semantics
which do not work on non-refcount python implementations like PyPY. It
also leads to lines of code like "iter=None" to trigger the writeback
resolution. On the c-api level the agreed upon solution is to add a new |||`NpyIter_Close` function in C, this is to be called before
`NpyIter_Dealloc`. The reviewers and I would like to ask the wider NumPy
community for opinions about the proposed python-level solution:
|turning the python nditer object into a context manager. This way
"writeback" occurs at context manager exit via a call to
`NpyIter_Close`, instead of like before when it occurred at nditer
deallocation (which might not happen until much later in Pypy, and could
be delayed by GC even in Cpython). Another solution that was rejected
(https://github.com/numpy/numpy/pull/10184) was to add an nditer.close()
python-level function that would not require a context manager It was
felt that this is more error-prone since it requires users to add the
line for each iterator created. The back-compat issues are that: 1. We
are adding a new function to the numpy API, `NpyIter_Close` (pretty
harmless) 2. We want people to update their C code using nditer, to call
`NpyIter_Close` before they call `NpyIter_Dealloc` and will start
raising a deprecation warning if misuse is detected 3. We want people to
update their Python code to use the nditer object as a context manager,
and will warn if they do not. We tried to minimize back-compat issues,
in the sense that old code (which didn't work in PyPy anyway) will still
work, although it will now emit deprecation warnings. In the future we
also plan to raise an error if an nditer is used in Python without a
context manager (when it should have been). For C code, we plan to leave
the deprecation warning in place probably forever, as we can only detect
the deprecated behavior in the deallocator, where exceptions cannot be
raised. Anybody who uses nditers should take a look and please reply if
it seems the change will be too painful. For more details, please see
the updated docs in that PR Matti (and reviewers) |
More information about the NumPy-Discussion
mailing list