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]
然而,这应该会让您找到一个方向,了解您可能希望如何从您所获得的内容出发。
我有一个 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]
然而,这应该会让您找到一个方向,了解您可能希望如何从您所获得的内容出发。