Я работаю с объектом Python, который реализует __add__
, но не является подклассом int
. MyObj1 + MyObj2
работает нормально, но sum([MyObj1, MyObj2])
привело к TypeError
, потому что sum()
первые попытки 0 + MyObj
. Чтобы использовать sum()
, моему объекту нужно __radd__
для обработкиMyObj + 0
или Мне нужно предоставить пустой объект в качестве параметра start
. Рассматриваемый объект не предназначен быть пустым.
Прежде чем кто-либо спросит, объект не похож на список -или на строку -, поэтому использование соединения ()или itertools не поможет.
Изменить для получения подробной информации:модуль имеет SimpleLocation и CompoundLocation. Я буду сокращать Location до Loc. SimpleLoc
содержит один правый -открытый интервал, то есть [начало, конец ). Добавление SimpleLoc
дает CompoundLoc
, который содержит список интервалов, например. [[3, 6), [10, 13)]
. Конечное использование включает повторение объединения, например. [3, 4, 5, 10, 11, 12]
, проверка длины и проверка членства.
Числа могут быть относительно большими (, скажем, меньше 2^32, но обычно 2^20 ). Интервалы, вероятно, не будут очень длинными (100 -2000, но могут быть длиннее ). В настоящее время сохраняются только конечные точки. Теперь я предварительно думаю о попытке создать подкласс set
таким образом, чтобы местоположение было построено как set(xrange(start, end))
. Однако добавление наборов даст Python (и математикам )соответствие.
Вопросы, которые я просмотрел:
Я рассматриваю два решения. Один из них — избегать sum()
и использовать цикл, предложенный в этом комментарии .Я не понимаю, почему 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()
для объектов, которые нельзя ни складывать с целыми числами, ни быть пустыми?