Python - 实现 CUSTOM "lshift" 方法 - 但不适用于位数组元素

Python - implement CUSTOM "lshift" method - but not for bitarray elements

我有一个 class,它有一个整数值的参数列表。 我必须实现自定义 lshift 方法,该方法将添加到列表中(我必须为我的用例覆盖 lshift 方法)。这是自定义 lshift 方法,因此它与 bitarrays 没有任何关系,但仅与列表中的 integers 一起使用(将其添加到列表中)并且它接收参数 元素 。我应该在没有 import 额外 python class 的情况下执行此操作。我还为此功能定义了测试,因此您可以看到结果应该是什么样子。 (我已经为 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'

不确定我做错了什么,任何提示将不胜感激。 提前致谢

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

其次,__lshift__ 方法存在逻辑错误 - 只有当 iterator 参数为 None 时才附加元素。因此,在您想要的最一般用例中,实际上什么都不会发生。

最后,在您的测试用例中,您希望对对象调用排序,这意味着该对象需要提供某种迭代器(通过 __iter__),否则它将简单地失败并显示 TypeError: 'CustomShift' object is not iterable.将它们放在一起,您的 class 将如下所示:

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]

然而,这应该会让您找到一个方向,了解您可能希望如何从您所获得的内容出发。