Skip to content

[Python] Scalar arithmetic dunders raise TypeError instead of returning NotImplemented #49826

Closed

Description

@kazeno

Describe the bug, including details regarding any error messages, version, and platform.

Version: pyarrow 24.0.0 (regression vs. 23.0.1)
Platform: Linux (python 3.12), but not platform-specific

In pyarrow 24.0.0, pyarrow.lib.Scalar gained arithmetic dunder methods (__add__, __sub__, __mul__, __truediv__, __pow__, __neg__, and bitwise ops) in python/pyarrow/scalar.pxi:

def __add__(self, object other):
    return _pc().call_function('add_checked', [self, other])

These implementations unconditionally dispatch to pyarrow.compute.call_function, which raises TypeError via _pack_compute_args when other is not a recognized pyarrow / list / tuple / ndarray type:

TypeError: Got unexpected argument type <class 'MyCustomColumn'> for compute function

Because a raised TypeError does NOT trigger Python's reflected-operator fallback (only a returned NotImplemented does, as you can see in Python data model, §3.3.8), any custom class that previously relied on its own __radd__ / __rmul__ / __rsub__ / __rtruediv__ to handle pyarrow.Scalar + my_obj is now broken. The user has no workaround from their side, as pyarrow.lib.Scalar is an immutable extension type and cannot be monkey-patched, and virtual subclass registration is not honored by CPython's binary-op dispatch (which uses PyType_IsSubtype at the C level).

Reproducer

import pyarrow

class MyCol:
    def __radd__(self, other):
        return "MyCol.__radd__ called"

s = pyarrow.scalar(5)
c = MyCol()

# Works on pyarrow <= 23 (Scalar had no __add__, so Python dispatches to MyCol.__radd__)
# Fails on pyarrow >= 24 with:
#   TypeError: Got unexpected argument type <class '__main__.MyCol'> for compute function
print(s + c)

Expected: "MyCol.__radd__ called" (or at least a NotImplemented return from Scalar.__add__ so Python can fall back).
Actual: TypeError from _pack_compute_args.

Why this matters

Libraries that wrap pyarrow arrays with a richer Python class (like our Data Curator library with its DataColumn class , but also other downstream projects) have historically been able to make pyarrow.Scalar + custom_column work by implementing __radd__ on their class (and the same for the other reflected-operators). This pattern is now silently broken by an upgrade to 24.0.0, with no opt-out and no Python-level workaround.

Component(s)

Python

Activity

  1. added a commit that references this issue on Apr 21, 2026
  2. AlenkaF commented on Apr 22, 2026

    @AlenkaF
    Member

    Thank you for opening an issue!
    It sure looks like we need to fix this, will look at the proposed PR and comment there.

    cc @rmnskb, @pitrou in case you have any opinions.

  3. rmnskb commented on Apr 22, 2026

    @rmnskb
    Contributor

    It should be fixed, I agree.
    @AlenkaF I think the same solution should be eventually applied to arrays as well.

  4. added a commit that references this issue on Apr 23, 2026
  5. added a commit that references this issue on May 31, 2026
  6. manyi-w commented on Jul 2, 2026

    @manyi-w

    Hi, a small quick question — I noticed this issue is related to two PRs. Do both of them aim to resolve it? Thanks!

  7. AlenkaF commented on Jul 8, 2026

    @AlenkaF
    Member

    Yes =)

  8. added 3 commits that reference this issue on Sep 11, 2026
  9. AlenkaF commented on Sep 11, 2026

    @AlenkaF
    Member

    @alex-anast could you comment on this issue so I can assign it to you?

  10. added this to the 26.0.0 milestone on Sep 30, 2026
  11. raulcd commented on Sep 30, 2026

    @raulcd
    Member

    Issue resolved by pull request 49845
    #49845

  12. added a commit that references this issue on Sep 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions