Избегание поведения начального аргумента суммы Python по умолчанию

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

14
задан Community 23 May 2017 в 11:54
поделиться