Python 切片操作后保留对象类型的有效方法

Python 切片操作后保留对象类型的有效方法,python,performance,oop,casting,slice,Python,Performance,Oop,Casting,Slice,我正在寻找一种快速、干净、符合python风格的方法来切割定制对象,同时在操作后保留其类型 为了给您提供一些上下文,我必须处理大量半非结构化数据,并在处理字典列表时进行处理。为了简化一些操作,我创建了一个“ld”对象,它继承自“list”。在众多功能中,它检查数据是否以正确的格式提供。让我们简单地说,它确保列表中的所有条目都是包含某个键“a”的字典,如下所示: class ld( list): def __init__(self, x): list.__init__

我正在寻找一种快速、干净、符合python风格的方法来切割定制对象,同时在操作后保留其类型

为了给您提供一些上下文,我必须处理大量半非结构化数据,并在处理字典列表时进行处理。为了简化一些操作,我创建了一个“ld”对象,它继承自“list”。在众多功能中,它检查数据是否以正确的格式提供。让我们简单地说,它确保列表中的所有条目都是包含某个键“a”的字典,如下所示:

class ld( list):
     def __init__(self, x):
          list.__init__(self, x)
          self.__init_check()

     def __init_check(self):
          for record in self:
               if isinstance( record, dict) and "a" in record:
                    pass
               else:
                     raise TypeError("not all entries are dictionaries or have the key 'a'")
          return
当数据符合要求并初始化ld时,此操作正常:

tt = ld( [{"a": 1, "b":2}, {"a":4}, {"a":6, "c":67}])
type( tt)
当数据不正确时,它也会做正确的事情:

ld( [{"w":1}])
ld( [1,2,3])
但是,当我继续切片对象时,问题出现了:

type( tt[:2])
tt[:2]是一个列表,不再是我在成熟的ld对象中创建的所有方法和属性。我可以将切片重新转换为ld,但这意味着它必须再次经历整个初始数据检查过程,大大降低了计算速度

以下是我提出的加快速度的解决方案:

class ld( list):
    def __init__(self, x, safe=True):
        list.__init__(self, x)
        self.__init_check( safe)

    def __init_check(self, is_safe):
        if not is_safe:
            return
        for record in self:
            if isinstance( record, dict) and "a" in record:
                pass
            else:
                raise TypeError("not all entries are dictionaries or have the key 'a'")
        return

    def __getslice__(self, i, j):
        return ld( list.__getslice__( self, i, j), safe=False)
有没有一种更干净、更像蟒蛇的方式?
提前感谢您的帮助。

我不认为通过子类化
列表来验证其内容的形状或类型是正确的方法。
列表
显然不关心它的内容,实现一个构造函数行为根据传递给它的标志而变化的类是混乱的。如果需要验证输入的构造函数,只需在返回列表的函数中执行检查逻辑即可

def make_verified_list(items):
    """
    :type items: list[object]
    :rtype: list[dict]
    """
    new_list = []
    for item in items:
        if not verify_item(item):
             raise InvalidItemError(item)
        new_list.append(item)
    return new_list

def verify_item(item):
    """
    :type item: object
    :rtype: bool
    """
    return isinstance(item, dict) and "a" in item

采用这种方法,您将不会发现自己在与核心数据结构的行为作斗争。

谢谢您的建议,但该对象会执行多个与问题无关的任务,因此我跳过了这些任务。对我来说,问题的核心是维护对象类型。