我有一个自定义序列类型。它本质上是一个列表和一个布尔标志的包装器,我希望它能够模拟通常的不可变序列行为。
我的问题是切片。我知道在 Python 3 中实现它的方法是有一个方法,如果是单个索引,__getitem__(key)
则返回一个项目,如果是切片对象,则返回一个切片序列。但是我应该如何区分这些情况呢?%key
%key
我基本上有两个假设。
sliced_list = self.wrapped_list[key]
if isinstance(key, slice):
return MyCustomSequenceType(sliced_list, boolean_flag)
return sliced_list
但这是邪恶的,不是吗?或者
sliced_list = self.wrapped_list[key]
try:
return MyCustomSequenceType(sliced_list, boolean_flag)
except TypeError:
return sliced_list
后者看起来更蟒蛇。MyCustomSequenceType.__init__(self, datas, flag)
它依赖于调用 len(datas)的事实,因此TypeError
如果%datas
是integer
. 但是,如果__init__
引发TypeError
另一个随机问题,它将无法追踪。还有http://wiki.cython.org/enhancements/numpy/getitem提示isinstance
更快(实际上更容易优化)。
那我该怎么办?