I am working with a Python object that implements __add__
, but does not subclass int
. MyObj1 + MyObj2
works fine, but sum([MyObj1, MyObj2])
led to a TypeError
, becausesum()
first attempts 0 + MyObj
. In order to use sum()
, my object needs __radd__
to handle MyObj + 0
or I need to provide an empty object as the start
parameter. The object in question is not designed to be empty.
Before anyone asks, the object is not list-like or string-like, so use of join() or itertools would not help.
Edit for details: the module has a SimpleLocation and a CompoundLocation. I'll abbreviate Location to Loc. A SimpleLoc
contains one right-open interval, i.e. [start, end). Adding SimpleLoc
yields a CompoundLoc
, which contains a list of the intervals, e.g. [[3, 6), [10, 13)]
. End uses include iterating through the union, e.g. [3, 4, 5, 10, 11, 12]
, checking length, and checking membership.
The numbers can be relatively large (say, smaller than 2^32 but commonly 2^20). The intervals probably won't be extremely long (100-2000, but could be longer). Currently, only the endpoints are stored. I am now tentatively thinking of attempting to subclass set
such that the location is constructed as set(xrange(start, end))
. However, adding sets will give Python (and mathematicians) fits.
Questions I've looked at:
- python's sum() and non-integer values
- why there's a start argument in python's built-in sum function
- TypeError after overriding the __add__ method
I'm considering two solutions. One is to avoid sum()
and use the loop offered in this comment. I don't understand why sum()
begins by adding the 0th item of the iterable to 0 rather than adding the 0th and 1st items (like the loop in the linked comment); I hope there's an arcane integer optimization reason.
My other solution is as follows; while I don't like the hard-coded zero check, it's the only way I've been able to make sum()
work.
# ...
def __radd__(self, other):
# This allows sum() to work (the default start value is zero)
if other == 0:
return self
return self.__add__(other)
In summary, is there another way to use sum()
on objects that can neither be added to integers nor be empty?