python / cpython

The Python programming language
https://www.python.org
Other
62.17k stars 29.88k forks source link

ctypes: Deprecate SetPointerType() and ARRAY() functions #105733

Closed vstinner closed 1 month ago

vstinner commented 1 year ago

The ctypes module has two undocumented functions: SetPointerType() and ARRAY(). These functions are marked as XXX Deprecated, but only in comments.

I propose to deprecate ctypes.SetPointerType() and ctypes.ARRAY() by emitting a DeprecationWarning warning.

These functions are not documented and not used in Python, but there are tested.

Linked PRs

encukou commented 1 month ago

I disagree with the proposal. (And with taking one hour between a proposal and merge.)

The plan to remove ARRAY in 3.15 goes against PEP 387:

If the expected maintenance overhead and security risk of the deprecated behavior is small (e.g. an old function is reimplemented in terms of a new, more general one), it can stay indefinitely (or until the situation changes).

(I'll note that this clarification got added a few days after this proposal, though.)

The function is two lines long, and has tests. It has no maintenance overhead or additional security risk. It's also used in third-party projects (some of which test with alphas/betas and have now switched to multiplication).

I propose to restore it and soft-deprecate instead. Would you be OK with that, @vstinner?


As for SetPointerType, yeah, no one should be using that, and hardly anyone is.

encukou commented 1 month ago

(anecdotally: at EuroPython I've seen a person use ARRAY in the REPL. This is not worth them re-learning how to make array types.)

vstinner commented 1 month ago

I didn't see any complain about the deprecation apart from you. I don't see the benefits of keeping two ways to create an array. PEP 20 says:

There should be one-- and preferably only one --obvious way to do it.

A code search on PyPI top 7,500 projects only finds 2 lines:

PYPI-2024-03-16/astroid-3.1.0.tar.gz: astroid-3.1.0/tests/brain/test_ctypes.py: ctypes.ARRAY(3, 2)
PYPI-2024-03-16/pwntools-4.12.0.tar.gz: pwntools-4.12.0/pwnlib/adb/bootloader.py: imgarray = ctypes.ARRAY(img_info, self.num_images)

The first one is stupid, ctypes.ARRAY(3, 2) returns 6... The first parameter must be a ctypes type, not an integer.

picnixz commented 1 month ago

There are a bit more usages on GitHub: https://github.com/search?q=%2F%28%3F-i%29ctypes%5C.ARRAY%5C%28%2F&type=code (but some of them are CPython but I found a bit more normal usages that are not 7 years old)

encukou commented 1 month ago

So it's PEP 20 against PEP 387, or your opinion against mine :(

JelleZijlstra commented 1 month ago

I would favor keeping ARRAY, since there is little maintenance cost involved and removing it would break at least some users.

picnixz commented 1 month ago

I personally like ARRAY because it tells you that are you are creating an array (visually speaking)

vstinner commented 1 month ago

There are a bit more usages on GitHub: https://github.com/search?q=%2F%28%3F-i%29ctypes%5C.ARRAY%5C%28%2F&type=code

Oh right. Let's keep ARRAY(). But I would suggest to simply remove the deprecation in this case, no need to soft deprecate it if we keep it.

encukou commented 1 month ago

I'm for soft deprectation, because it tells you which of the two ways to do it is the obvious one :)

picnixz commented 1 month ago

Closing since completed in https://github.com/python/cpython/pull/122281.