我正在编写一个解析器,有很多文本需要解码,但我的大多数用户只会关心所有数据中的几个字段。所以我只想在用户实际使用某些数据时进行解码。这是一个好方法吗?
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'
关于Python:惰性字符串解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1656048/