Я работаю с объектом 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() для объектов, которые не могут быть добавлены в целые числа и не пусты?