现在我有了上面的源代码:
class Stats(object):
def __init__(self):
self._pending = []
self._done = []
@property
def pending(self):
return self._pending
这些列表的填充方式对于我的问题并不重要。
情况是我通过这种方式获取这些列表的子列表:
stats = Stats()
// code to fill the lists
stats.pending[2:10]
这里的问题是我希望获得与检索到的元素一样多的元素。 在上面的示例中,我期望一个包含 8 个元素 (10-2) 的子列表。
当然,如果列表较短,实际上我会得到少于 8 个元素。
所以,我需要的是:
- 当列表有足够的项目时,它返回相应的子列表。
- 当列表较短时,它会返回一个具有预期长度的子列表,其中填充原始列表的最后一个元素以及额外项目的默认值(例如 None)。
这样,如果我这样做:
pending_tasks = stats.pending[44:46]
并且待处理列表仅包含30个元素,它应该返回两个默认元素的列表,例如:[None, None];而不是空列表 ([]),这是列表的默认行为。
我想我已经知道如何在正常的方法/函数中执行此操作,但我想以最干净的方式执行此操作,如果可能的话,尝试遵循 @property 方法。
非常感谢!
最佳答案
这并不容易做到,因为切片操作是您要修改的内容,并且是在属性返回原始列表
之后发生的。但这并非不可能,您只需要用另一个对象包装常规列表,该对象将负责为您填充切片。这有多容易或多困难可能取决于您需要包装器实现多少列表接口(interface)。如果您只需要索引和切片,那非常简单:
class PadSlice(object):
def __init__(self, lst, default_value=None):
self.lst = lst
self.default_value
def __getitem__(self, index):
item = getitem(self.lst, index)
if isinstance(index, slice):
expected_length = (index.stop - index.start) // (index.step or 1)
if len(item) != expected_length:
item.extend([default_value] * (expected_length - len(item)))
return item
此代码可能不适用于负步骤切片或未指定端点之一的切片(它确实具有检测省略步骤的逻辑,因为这很常见)。如果这对您很重要,您可能可以修复这些极端情况。
关于python - 哪种方法可以更简洁地获取 Python @property 作为具有特定条件的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42281234/