我刚刚提高了一个需要支持切片的库的测试覆盖率,并且注意到切片可以包含非整型类型:
>>> slice(1, "2", 3.0)
slice(1, '2', 3.0)
>>> sl = slice(1, "2", 3.0)
>>> [1,2,3][sl]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: slice indices must be integers or None or have an __index__ method
这也许只是我在静态类型背景下的理解,但没有
__index__
的内置类型可以在此处传递而不引发 TypeError
,这对我来说似乎很奇怪。为什么会这样?我可以假设允许任意类型是为了支持实现了 __index__
的类型进行鸭子类型检查吗?缺乏类型检查是否是出于性能原因,以支持最常见的用例?在 PEP 357 之前,该示例中的切片是否无效?
a[3, ..., 5]
这样的东西,...
不是切片的一部分。 - Mark Dickinson