Я работаю с объектом Python, который реализует __add__
, но не подклассом int
. MyObj1 + MyObj2
работает нормально, но sum([MyObj1, MyObj2])
приводит к TypeError
, потому что sum()
сначала пытается 0 + MyObj
. Чтобы использовать sum()
, моей функции требуется __radd__
для обработки MyObj + 0
или. Мне нужно предоставить пустой объект в качестве параметра start
. Объект, о котором идет речь, не предназначен для того, чтобы быть пустым.
Прежде чем кто-нибудь спросит, объект не похож на список или не похож на строку, поэтому использование join() или itertools не помогло бы.
Изменить для деталей: модуль имеет SimpleLocation и CompoundLocation. Я сокращу местоположение в Loc. A SimpleLoc
содержит один правый открытый интервал, т.е. [Начало, конец]. Добавление SimpleLoc
дает a CompoundLoc
, который содержит список интервалов, например. [[3, 6), [10, 13)]
. Использование конца включает итерацию через объединение, например. [3, 4, 5, 10, 11, 12]
, проверка длины и проверка членства.
Числа могут быть относительно большими (например, меньше 2 ^ 32, но обычно 2 ^ 20). Интервалы, вероятно, не будут чрезвычайно длинными (100-2000, но могут быть длиннее). В настоящее время сохраняются только конечные точки. Я сейчас мысленно подумываю о попытке подкласса set
, чтобы местоположение было построено как set(xrange(start, end))
. Однако добавление наборов даст Python (и математикам) подходит.
Вопросы, на которые я смотрел:
- сумма() и нецелые значения python
- почему есть начальный аргумент в встроенной функции суммы python
- TypeError после переопределения метода __add__
Я рассматриваю два решения. Один заключается в том, чтобы избежать sum()
и использовать цикл, предложенный в этом comment. Я не понимаю, почему sum()
начинается с добавления 0-го элемента итерабельности в 0 вместо добавления 0-го и 1-го элементов (например, цикл в связанном комментарии); Надеюсь, существует загадочная целая причина оптимизации.
Мое другое решение таково: в то время как мне не нравится жестко закодированная проверка нуля, это единственный способ, с помощью которого я мог сделать работу sum()
.
# ...
def __radd__(self, other):
# This allows sum() to work (the default start value is zero)
if other == 0:
return self
return self.__add__(other)
В общем, есть ли другой способ использовать sum()
для объектов, которые не могут быть добавлены в целые числа и не пусты?