从实现了不推荐使用的__getslice__
的父级继承时,是否有任何方法可以在原始片被munging之前获取它?在
下面是一个示例测试用例,我不知道如何在相关信息丢失之前重写__getslice__
。可以用蒙克斯补丁代替吗?可以通过cpython扩展来完成吗?在
from unittest import TestCase
from mock import patch
import sys
class BigIntSlicableList(list):
def __getslice__(self, start, stop):
return self[start:stop:None] # force fallback to __getitem__
class BigIntSlicableListTest(TestCase):
@patch.object(BigIntSlicableList, '__getitem__')
def test_slice_big_endpoint(self, mock):
mylist = BigIntSlicableList([1, 2, 3])
start, stop = sys.maxint - 1, sys.maxint + 1
bigint_slice = slice(start, stop)
mylist[start:stop]
mock.assert_called_once_with(bigint_slice)
self.assertEqual(mylist[start:stop], mylist[start:stop:])
注意:这里我只使用list
作为ssce,我并不是真的要创建一个BigList类,而是想知道当父类可能已经实现了__getslice__
时,如何绕过限制。在
以下尝试无效:
^{pr2}$del语句引发AttributeError
,即使hasattr(MyList, '__getslice__')
返回True。在
这个问题接this one。在
在C中定义的类型上不能使用monkeypatch,这是因为}。而是填充^{} structure 中的
list
没有{sq_slice
槽。允许重写,但不能使其消失。在即使您继承了Python实现,monkey-patching也可以归结为从原始类中删除
__getslice__
方法。在您唯一的选择是提供自己的版本,这包括} object 作为这样的覆盖:
sys.maxsize
限制。我更喜欢使用^{前提是基类型知道如何处理
slice
对象(如果要支持跨步,就必须这样做)。在通过使用三元素切片表示法或传递显式
^{pr2}$slice()
对象,可以完全避免__getslice__
方法:相关问题 更多 >
编程相关推荐