我正在使用实现__add__
但不子类化的 Python 对象int
。MyObj1 + MyObj2
工作正常,但sum([MyObj1, MyObj2])
导致TypeError
, 因为sum()
第一次尝试0 + MyObj
. 为了使用sum()
,我的对象需要__radd__
处理MyObj + 0
或者我需要提供一个空对象作为start
参数。有问题的对象并非设计为空的。
在任何人问之前,该对象不是类似列表或类似字符串的,因此使用 join() 或 itertools 将无济于事。
编辑细节:该模块有一个 SimpleLocation 和一个 CompoundLocation。我将 Location 缩写为 Loc。ASimpleLoc
包含一个右开区间,即[start, end)。添加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(和数学家)适合。
我看过的问题:
我正在考虑两种解决方案。一是避免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()
既不能添加到整数也不能为空的对象?