0

ファイルオブジェクト'item'からテキストをフォーマットするために次の関数を書いています。

def clean(item):
    lines = open(str(item)).readlines()
    outp = []
    switch = 1

    for line in lines:
        line = line.strip()
        if line:
            line = re.sub(' +', ' ', line)
            if '%' in line:
                line = line.replace('%', ' per cent')
            if line.startswith('Note'):
                switch = 2

            if line.startswith('l\t'):
                line = line.split('\t')
                line[0] = '<@01_bullet_point>l<@$p>'
                line = '\t'.join(line)
                outp.append(get_prefix(switch,1) + line)
            else:
                outp.append(get_prefix(switch,2) + line)
            outp.append('\n')
    return ''.join(outp)

TypeErrorが発生します:+のサポートされていないオペランドタイプ:'NoneType'および'str'

私は解決策をグーグルで探しましたが、http: //www.skymind.com/~ocrow/python_string/を見つけました。その解決策4は、私が正しい方向に進んでいることを確認しているようです。

これが参照している他の関数が機能していることが確認されているので、問題はここにあるはずですが、関連するSOの質問を見つけて、Pythonのコピーを簡単に確認したところ、なぜ私がエラーが発生します。私の最善の推測は可変スコープと関係があることでしたが、それを見ることができず、繰り返しますが、検索しても同じ問題として理解できるものは何も見つかりませんでした。明らかな何かが欠けていると思いますが、どんな助けでも大歓迎です。

get_prefixの編集は次のとおりです。

def get_prefix(section, type):
    if section == 1:
        if type == 1:
            prefix = '@01_bullets:'
        elif type == 2:
            prefix = '@04_section_sub_subhead:'
        else:
            prefix = '@06_body_text:'

    else:
        if type == 2:
            prefix = '@14_notes_sub_sub_heading:'
        else:
            prefix = '@16_notes_text:'

    return prefix

Noneがどのように返されるかわかりません。

完全なトレースバックは次のとおりです。

File "rep_builder.py", line 65, in <module>
`rep.write(clean(item))`
File "rep_builder.py", line 36, in clean
`outp.append(get_prefix(switch,2) + line)`
TypeError: unsupported operand types for +: 'NoneType' and 'str'

更新が遅くなってすみません、接続できない2台のマシンで作業しています(長い話)。

4

3 に答える 3

4

唯一の+操作はoutp.append(get_prefix(switch,1) + line)類似していますoutp.append(get_prefix(switch,2) + line)-つまり、それget_prefix()が原因であり、ここに戻りNoneます。

于 2012-05-15T17:38:55.293 に答える
0

私はあなたの呼び出しが返されるget_prefix結果になっていると思います。None

エラーメッセージと利用可能なソースコードを考えると、これが原因である可能性が最も高くなります。これは、不明なものと+演算子を使用して文字列を連結しようとしている唯一の場所だからです。つまり、

outp.append(get_prefix(switch,1) + line)

また

outp.append(get_prefix(switch,2) + line)

編集:get_prefix関数をチェックする1つの方法prefixは、関数の開始時に変数にデフォルトの文字列値を指定し、それによって問題が解消されるかどうかを確認することです。それはその関数を指しているでしょう、私は同意しなければなりませんが、私はそのコードがNone今示されているようにどのように戻ることができるかわかりません。

于 2012-05-15T17:39:38.333 に答える
0

インデントを確認してください。get_prefixこんな感じじゃないですか?clean(のインデントが間違っているのでお願いします):

def get_prefix(section, type):
    if section == 1:
        if type == 1:
            prefix = '@01_bullets:'
        elif type == 2:
            prefix = '@04_section_sub_subhead:'
        else:
            prefix = '@06_body_text:'

    else:
        if type == 2:
            prefix = '@14_notes_sub_sub_heading:'
        else:
            prefix = '@16_notes_text:'

        return prefix

上記のようにインデントされ、等しい場合get_prefixに戻ります。Nonesection1

于 2012-05-15T18:29:58.420 に答える