Skip to content

Consider adding public PyLong_FlipSign() function #120446

Description

@skirpichev

Feature or enhancement

Proposal:

Currently there is only a slow way (i.e. PyNumber_Negative()) to invert the sign of a big integer. Direct manipulation of the sign value is available only via private function, e.g. _PyLong_SetSignAndDigitCount():
https://github.com/aleaxit/gmpy/blob/1c0d4f38d4f1093df0e9460d82e4331d3d3946b6/src/gmpy2_convert_gmp.c#L153

I propose this interface:

int PyLong_FlipSign(PyObject *obj);

For small integers it will fallback to PyLong_FromLong() (like _PyLong_Negate() does), for the rest - just _PyLong_FlipSign() to change sign in place.

Alternatively, we could just expose a direct wrapper of _PyLong_FlipSign() and warn users to not use this function for small ints (that doesn't make sense for me anyway).

In both variants, on success - flip the sign of obj and return 0. On failure - return -1 with exception set. Shouldn't fail on PyLongObject or it's subtype.

I'll work on a patch if this proposal does make sense.

Has this already been discussed elsewhere?

This is a minor feature, which does not need previous discussion elsewhere

Links to previous discussion of this feature:

No response

Linked PRs

Activity

  1. serhiy-storchaka commented on Jun 13, 2024

    @serhiy-storchaka
    Member

    I planned to propose adding PyLong_NegativeInPlace() and PyLong_AbsoluteInPlace().

  2. skirpichev commented on Jun 13, 2024

    @skirpichev
    MemberAuthor

    Hmm, it seems that my first variant can't be implemented with same signature as the second. Rather it should be (like _PyLong_Negate()):

    int PyLong_FlipSign(PyObject **obj);
  3. added a commit that references this issue on Jun 14, 2024
  4. skirpichev commented on Jun 14, 2024

    @skirpichev
    MemberAuthor

    adding PyLong_NegativeInPlace() and PyLong_AbsoluteInPlace().

    I think this naming better fits case, when there will be also other PyNumber_*-like functions. But I'm not sure that we have practical need for that.

    FYI, PR: #120489 (as a draft; IIUC, this should be discussed in C-API WG)

  5. skirpichev commented on Jul 4, 2024

    @skirpichev
    MemberAuthor

    PR closed in favor of #121339.

    Now I don't have a strong motivation for this function. Kept open as @serhiy-storchaka planned a similar proposal.

  6. vstinner commented on Jan 27, 2025

    @vstinner
    Member

    Python int objects are immutable. I dislike APIs which seem to treat them as mutable objects.

    What's the status of this issue? PEP 757 has been implementation in Python 3.14. Can we close this issue?

  7. encukou commented on Jan 28, 2025

    @encukou
    Member

    Proposal should go to the C API WG (ideally after public discussion)

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions