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'

ある時点であると言っていcurrentますNone

では、どのよう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 でが 1 の場合ntab_old、2 レベルの「インデント」で移動する必要があるかもしれませんが、コードはネストされた を 1 つだけ作成します_MyList

インデントのレベルが 2 つも跳ね上がることはないと思うかもしれません。ただし、特にデータが長い場合は、目で確認するのが難しい場合があります。データは私たちが思っているほど規則的ではないかもしれません。

'\t'また、の右側にストレイがあると、おそらくインデント レベルには影響しないはずですが|、カウントに影響します。ntab

于 2012-10-25T12:38:14.390 に答える