0

所以前几天,SOCommunity 帮我做了一个解析器。即:

def MyList(self):
    class _MyList(list):
        def __init__(self, parent):
            self.parent = parent
            list.__init__(self)
    top = current = _MyList(None)
    ntab_old = 0
    for line in self.raw_data:
        ntab = line.count('\t')
        if(ntab_old > ntab):
            for _ in range(ntab_old-ntab):
                current = current.parent
        elif(ntab_old<ntab):
            current.append(_MyList(current))
            current = current[-1]
        current.append(line.strip('\t').strip('|'))
        ntab_old =ntab
    return top

像这样解析数据:

 |[nothing detected] www.neopets.com/
        |status: (referer=http://www.google.com)saved 55189 bytes /fetch_d4cd213a56276ca726ddd437a1e75f1024ab7799
        |file: fetch_d4cd213a56276ca726ddd437a1e75f1024ab7799: 55189 bytes
        |file: decoding_367af53b4963986ecdeb9c09ce1a405b5b1ecd91: 68 bytes
        |[nothing detected] (script) images.neopets.com/js/common.js?v=6
            |status: (referer=http://www.google.com)saved 1523 bytes /fetch_8eeadcc08d4cb48c02dedf18648510b75190d1d7failure: [Errno 13] Permission denied: '/tmp/tmpsha1_8d7fb3ff1ef087c7ea2bf044dee294735a76ed4b.js'
            |file: fetch_8eeadcc08d4cb48c02dedf18648510b75190d1d7: 1523 bytes

这应该返回包含每个子部分的嵌套列表。但是,不知从何而来,我收到了这些错误:

      current.append(line.strip('\t').strip('|'))
AttributeError: 'NoneType' object has no attribute 'append'

任何帮助,将不胜感激

4

1 回答 1

2
current.append(...)
AttributeError: 'NoneType' object has no attribute 'append'

是说在某些时候currentNone

那么如何current设置None呢?我的猜测是它可能发生在这里:

        for _ in range(ntab_old-ntab):
            current = current.parent

如果 current 经常被设置为其父级,它最终将被设置为,None因为在顶层,_MyList被实例化None为父级:

top = current = _MyList(None)

这段代码也可能有问题:

    elif(ntab_old<ntab):
        current.append(_MyList(current))
        current = current[-1]

如果ntab是 3,并且ntab_old是 1,那么可能需要移动两级“缩进”,但代码只创建一个嵌套的_MyList.

你可能会认为你的缩进级别永远不会跳两级。但这可能很难用你的眼睛来判断,尤其是在数据很长的情况下。数据可能不像我们想象的那么规律。

此外,如果'\t'在 的右侧有一个杂散点|,那么它会影响ntab计数,即使它可能不应该影响缩进级别。

于 2012-10-25T12:38:14.390 回答