Skip to content

Support __index__() for unsigned integer converters in PyArg_Parse and Argument Clinic #132987

Description

@serhiy-storchaka

The __index__() special method was introduced to make other integer-like types which are not int subclasses to be accepted as integer arguments.

It is supported by all PyArg_Parse format units for integers, except k (long sized bitfield) and K (long long sized bitfield). Argument Clinic has the same behavior for unsigned_long(bitwise=True) and unsigned_long_long(bitwise=True). It supports also non-bitwise unsigned integer converters, all of them do not support __index__().

Note that making PyLong_AsUnsignedLong() and PyLong_AsUnsignedLongLong() to support __index__() is potentially unsafe. But the higher level code that uses them, can be changed.

Linked PRs

Activity

  1. added 2 commits that reference this issue on Apr 26, 2025
  2. added 12 commits that reference this issue on Apr 26, 2025
  3. serhiy-storchaka commented on Apr 28, 2025

    @serhiy-storchaka
    MemberAuthor

    The following PRs change the code which do not use PyArg_Parse or Argument Clinic, but directly call PyLong_AsUnsignedLong(), PyLong_AsUnsignedLongLong() or PyLong_AsSize_t(). In many case, the simplest way is to use PyLong_AsNativeBytes() or converters like _PyLong_UnsignedLongLong_Converter(), but the side effect is that ValueError is now raised instead of OverflowError for negative values. See also #74020.

  4. added 7 commits that reference this issue on Apr 29, 2025
  5. serhiy-storchaka commented on May 13, 2025

    @serhiy-storchaka
    MemberAuthor

    Some code left in the ctypes module, but I left it for later. This is a large issue, and not in all cases we may automatically use __index__. For example, int.__add__ does not use __index__, they look similar.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions