gpt4 book ai didi

python - 哪种方法可以更简洁地获取 Python @property 作为具有特定条件的列表?

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

现在我有了上面的源代码:

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/

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