Python 切片操作后保留对象类型的有效方法
我正在寻找一种快速、干净、符合python风格的方法来切割定制对象,同时在操作后保留其类型 为了给您提供一些上下文,我必须处理大量半非结构化数据,并在处理字典列表时进行处理。为了简化一些操作,我创建了一个“ld”对象,它继承自“list”。在众多功能中,它检查数据是否以正确的格式提供。让我们简单地说,它确保列表中的所有条目都是包含某个键“a”的字典,如下所示:Python 切片操作后保留对象类型的有效方法,python,performance,oop,casting,slice,Python,Performance,Oop,Casting,Slice,我正在寻找一种快速、干净、符合python风格的方法来切割定制对象,同时在操作后保留其类型 为了给您提供一些上下文,我必须处理大量半非结构化数据,并在处理字典列表时进行处理。为了简化一些操作,我创建了一个“ld”对象,它继承自“list”。在众多功能中,它检查数据是否以正确的格式提供。让我们简单地说,它确保列表中的所有条目都是包含某个键“a”的字典,如下所示: class ld( list): def __init__(self, x): list.__init__
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
采用这种方法,您将不会发现自己在与核心数据结构的行为作斗争。谢谢您的建议,但该对象会执行多个与问题无关的任务,因此我跳过了这些任务。对我来说,问题的核心是维护对象类型。