Python:惰性字符串解码

标签 python lazy-evaluation

我正在编写一个解析器,有很多文本需要解码,但我的大多数用户只会关心所有数据中的几个字段。所以我只想在用户实际使用某些数据时进行解码。这是一个好方法吗?

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/

相关文章:

haskell - netwire:处理相互依赖的线路中的惰性(?)

haskell - Haskell 的 'evaluate' 是否减少到正常或 WHNF?

scala - 访问惰性 val 的类型会导致它被评估吗?

Python urllib 只下载网页的某些部分?

python - 生成递增的 Nonce

python - 我在 python 中对齐结果时遇到问题

programming-languages - 非升降式产品的缺点?

haskell - 如何防止GHC中的共享?

python - 如何在脚本(pycharm)中使用 ffmpeg 将 webm/mp4 文件转换为 mp3?

python - 在 Python 中进行字符串连接的速度、安全性和兼容性