我有一個自定義的序列類型。它本質上是一個列表和一個布爾標誌的包裝,我希望它能夠模擬通常的不可變序列行爲。什麼是pythonic /更快的方式來檢查自定義__getitem__方法的「關鍵」參數是否是切片?
我的問題是切片。據我所知,在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
後者看起來更pythonic。它依賴於一個事實,即MyCustomSequenceType.__init__(self, datas, flag)
調用LEN(DATAS),它使提高TypeError
如果%datas
是integer
。但是,如果__init__
提出TypeError
爲另一個隨機問題它將無法追查。另外http://wiki.cython.org/enhancements/numpy/getitem暗示isinstance
更快(實際上更容易優化)。
那我該怎麼辦?
我不認爲'isinstance'在這種情況下是邪惡的。它有足夠的非邪惡用途被包含在Python中(與goto不同),這可能就是其中之一。 – 2011-05-19 12:23:43
嗯,它變成了一個蠑螈。 – Evpok 2011-05-19 12:39:38
嗯,我想這是邪惡的。除非你做了一些值得擁有的東西。 – 2011-05-19 16:52:58