【发布时间】:2014-10-25 19:19:45
【问题描述】:
当从实现了已弃用的__getslice__ 的父级继承时,有没有办法在原始切片被删除之前获取它?
这是示例测试用例,我不知道如何在相关信息已经丢失之前覆盖__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__。
以下尝试不起作用:
class MyList(list):
pass
del MyList.__getslice__
del 语句引发 AttributeError,即使 hasattr(MyList, '__getslice__') 返回 True。
这个问题来自this one。
【问题讨论】:
标签: python python-2.7 inheritance monkeypatching