Python实现自定义的“lshift”方法,但不用于位数组元素

2024-05-16 09:34:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个类,它有一个整数值的参数列表。 我必须实现customlshift方法,该方法将添加到列表中(我必须为我的用例重写lshift方法)。这是一种自定义的lshift方法,因此它不包含任何与位数组有关的内容,而只处理列表中的整数(将其添加到列表中),并接收参数元素。我应该在不导入其他python类的情况下完成这项工作。我还为这个功能定义了测试,所以您可以看到结果应该是什么样子(我已经为add、len和iter实现了自定义方法,但我认为这不相关)

class CustomShift:

    def __init__(self, iterator=None):
        self.iterator = iterator
        if (self.iterator):
            self.iterator = list(dict.fromkeys(self.iterator))

    def __lshift__(self, element):
        """Add an element to the list.

        >>> shiftInstance = CustomShift()
        >>> _ = shiftInstance << 4
        >>> sorted(shiftInstance << 5 << 6 << 4)
        [4, 5, 6]
        """
        if self.iterator is None:
            self.iterator = []
            if element:
                self.iterator.append(element)

if __name__ == "__main__":
    import doctest
    from pprint import pprint
    doctest.testmod()

前两个测试通过,但第三个测试失败

TypeError: unsupported operand type(s) for <<: 'NoneType' and 'int'

不知道我做错了什么,任何暗示都将不胜感激。 提前谢谢


Tags: 方法importselfnone列表参数ifdef
1条回答
网友
1楼 · 发布于 2024-05-16 09:34:19

首先,__lshift__需要返回一个值——即使它改变了它正在处理的实例。为了使链接按您期望的方式工作,它必须返回自身。由于第一个<<操作不返回任何内容,因此任何后续操作都将导致您注意到的TypeError异常

第二,__lshift__方法有一个逻辑错误-只有当iterator参数是None时才追加元素。因此,在您想要的最普遍的用例中,实际上不会发生任何事情

最后,在您的测试用例中,您希望对该对象调用sort,这意味着该对象需要提供某种迭代器(通过__iter__),否则它将因TypeError: 'CustomShift' object is not iterable而失败。把这些放在一起,你的课看起来是这样的:

class CustomShift:

    def __init__(self, iterator=None):
        self.iterator = iterator
        if (self.iterator):
            self.iterator = list(dict.fromkeys(self.iterator))

    def __lshift__(self, element):
        """Add an element to the list.

        >>> shiftInstance = CustomShift()
        >>> _ = shiftInstance << 4
        >>> sorted(shiftInstance << 5 << 6 << 4)
        [4, 5, 6]
        """
        if self.iterator is None:
            self.iterator = []
        if element:
            self.iterator.append(element)
        return self

    def __iter__(self):
        return iter(self.iterator)

但是,测试仍然会失败,因为按照它的结构,shiftInstance已经附加了一个4,它被分配给了_

Failed example:
    sorted(shiftInstance << 5 << 6 << 4)
Expected:
    [4, 5, 6]
Got:
    [4, 4, 5, 6]

然而,这应该把你推向一个方向,你可能想从你所得到的出发

相关问题 更多 >