Python:惰性字符串解码
作者:互联网
我正在编写一个解析器,并且有很多文本需要解码,但是我的大多数用户只会关心所有数据中的几个字段.因此,我只想在用户实际使用某些数据时进行解码.这是一个好方法吗?
class LazyString(str):
def __init__(self, v) :
self.value = v
def __str__(self) :
r = ""
s = self.value
for i in xrange(0, len(s), 2) :
r += chr(int(s[i:i+2], 16))
return r
def p_buffer(p):
"""buffer : HASH chars"""
p[0] = LazyString(p[2])
那是我唯一需要重写的方法吗?
解决方法:
我不确定在这里实现字符串子类有什么好处.在我看来,如果您正在处理包含PB级数据的流,则只要创建了不需要的对象,就已经失去了游戏.您的首要任务应该是忽略尽可能多的输入.
您当然可以构建一个类似字符串的类来执行此操作:
class mystr(str):
def __init__(self, value):
self.value = value
self._decoded = None
@property
def decoded(self):
if self._decoded == None:
self._decoded = self.value.decode("hex")
return self._decoded
def __repr__(self):
return self.decoded
def __len__(self):
return len(self.decoded)
def __getitem__(self, i):
return self.decoded.__getitem__(i)
def __getslice__(self, i, j):
return self.decoded.__getslice__(i, j)
等等.这样做的怪异之处在于,如果您将str子类化,则将在传递给构造函数的值上调用未显式实现的每个方法:
>>> s = mystr('a0a1a2')
>>> s
¡¢
>>> len(s)
3
>>> s.capitalize()
'A0a1a2'
标签:lazy-evaluation,python 来源: https://codeday.me/bug/20191210/2101668.html