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

标签 python python-2.7 properties

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

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/

相关文章:

python - 为什么我收到错误 : "FileExistsError: [WinError 183] Cannot create a file when that file already exists"?

python - Flask View 中的 ajax 发布数据

Java 属性类

python - 尝试使用 rpy2 模块从 Python 脚本调用 R - 帮助设置 R 主目录?

python - sphinx、buildbot(和代码覆盖率)。他们如何整合?

python - 如何使用python获取隐藏输入的值?

python - flask 的双向 ssl 身份验证

C# 属性继承无法正常工作

objective-c - 现代 Objective-C 约定真的没有任何不是属性的 ivar 吗?

python - 卷积神经网络?