gpt4 book ai didi

python - 部分继承——继承一些功能,减去一个有问题的方法

转载 作者:太空宇宙 更新时间:2023-11-04 03:42:31 25 4
gpt4 key购买 nike

从实现了已弃用的 __getslice__ 的父级继承时,有没有办法在它被修改之前获取原始切片?

这是示例测试用例,我不知道如何在相关信息已经丢失之前的某个点覆盖 __getslice__ 。可以用 monkeypatching 代替吗?可以通过 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 .

最佳答案

你不能,不能使用 C 中定义的类型上的 monkeypatch。那是因为 list 没有 __getslice__。它会填充 PySequenceMethods structure 中的 sq_slice 槽。 .允许覆盖,但您不能让它消失。

即使您继承自 Python 实现,猴子修补也将归结为从原始类中删除 __getslice__ 方法

您唯一的选择是提供您自己的版本,其中包括 sys.maxsize 限制。我更喜欢使用 slice() object对于这样的覆盖:

def __getslice__(self, start, stop):
return self[slice(start, stop)]

前提是基本类型知道如何处理 slice 对象(如果它想支持 strides,它必须这样做)。

您可以通过使用三元素切片符号或通过显式传递 slice() 对象来完全避免 __getslice__ 方法:

mylist[start:stop:None]
mylist[slice(start, stop)]

关于python - 部分继承——继承一些功能,减去一个有问题的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25607917/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com