编程语言
首页 > 编程语言> > Python:惰性字符串解码

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