shu*_*e87 6 python slice python-3.x python-internals
我只是改进了一个必须支持切片的库的测试覆盖率,我注意到切片可以包含非整数类型:
>>> 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
Run Code Online (Sandbox Code Playgroud)
这可能只是我的静态输入背景,但对我来说,似乎很奇怪__index__没有a 的内置类型可以在这里传递TypeError.为什么会这样?我是否正确假设允许任意类型以支持实现类型的鸭子类型__index__?由于最常用案例的性能原因,是否缺乏类型检查?
在PEP 357之前,示例中的切片无效吗?
我假设允许任意类型以支持实现的类型的鸭子类型是否正确
__index__?
没有实际原因说明为什么应该限制初始化slice对象时传递的类型。正如 for 的理性中所述PEP 357,numpy它使用的数字类型不能从 object 继承,因此issubclass对传递的类型的严格检查将使它们无法用作索引值。因此,使用鸭子类型,如果它定义了适当的方法(__index__),那么它就可用。
__index__另请注意,仅当应用切片(如您所见,在, ieTypeError期间引发)操作(当调用 尝试获取您传递的值时)时,才会强制执行此操作( 的存在) 。__getitem__list_subscriptPySlice_GetIndicesEx
切片对象初始值设定项不区分它接受的类型,所有PyObject's 都可以应用,从其签名可以看出:
PyObject *
PySlice_New(PyObject *start, PyObject *stop, PyObject *step)
{
/* rest omitted */
Run Code Online (Sandbox Code Playgroud)
之前
PEP 357示例中的切片无效吗?
我刚刚构建了一个2.4Python版本并对其进行了测试(如果我没有记错的话,PEP 357出现在2.5),再次检查参数是否为数字不是在初始化期间完成的,而是在__getitem__调用时完成的;唯一不同的是异常消息,它没有任何关于 dunder 的通知__index__(当时显然不存在):
Python 2.4 (#1, Sep 11 2016, 18:13:11)
[GCC 5.4.0 20160609] on linux4
Type "help", "copyright", "credits" or "license" for more information.
>>> s = slice(0, Ellipsis)
>>> [1, 2, 3][s]
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: slice indices must be integers
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
117 次 |
| 最近记录: |