4

それで、Pythonの「リスト内包表記」について学びました。これらのいくつかは、1 行 (PEP8) には長すぎます。私は、これらを分割するための最良の (最も読みやすい) 方法を見つけようとしています。

私はこれを思いついた

questions = [
    (
        q,
        q.vote_set.filter(choice__exact='Y'),
        q.vote_set.filter(choice__exact='N'),
        request.session.get(str(q.id))
    )
    for q in questions
]

しかし、それはまだ前の空白について文句を言い]ます、特定のpep8エラーはE202

これはインデントされたブロックにあります。

4

4 に答える 4

1

私はおそらく次のようにします:

questions = [(q, 
              q.vote_set.filter(choice__exact='Y'), 
              q.vote_set.filter(choice__exact='N'), 
              request.session.get(str(q.id)))
                  for q in questions]

PEP8 は、最善の判断で使用することを意図していることに注意してください。すべての状況で絶対に従うことを意図したものではありません。また、複数のルールが競合する場合に常に意味を成すように構造化されているわけでもありません。

たまに意図的にルールを破っても問題ありません。そのようなチェッカーは、誤って壊さないようにするためのものです。

編集:コメントを回答に移動します。

あなたのコードは、括弧と括弧を別々の行に置いているため、Lisp に似た括弧言語や C に似た中括弧言語に少し似すぎています。

Python では、インデントを使用して、別の言語で別の行にブラケット/括弧/ブレースで通常表示するものを表示するだけです。コードを取得してその変更を加えた場合、それは私のバージョンと同じです。

ただし、PEP チェッカーについてはあまり心配する必要はありません。括弧と括弧を別々の行に置くことで得られる余分な空白が本当に好きなら、それをしてください。それを「悪いコード」にすることも、可読性を低下させることもありません。

于 2011-08-09T01:40:23.013 に答える
0

また、上記のコードで PEP8 警告を再現できませんでした。おそらく、正確なコードをペーストビンに入れることができますか?

PEP8 のテスト ケースの例 ( --show-pep8 オプションを使用する場合) は次のとおりです。

Avoid extraneous whitespace in the following situations:

- Immediately inside parentheses, brackets or braces.

- Immediately before a comma, semicolon, or colon.

Okay: spam(ham[1], {eggs: 2})
E201: spam( ham[1], {eggs: 2})
E201: spam(ham[ 1], {eggs: 2})
E201: spam(ham[1], { eggs: 2})
E202: spam(ham[1], {eggs: 2} )
E202: spam(ham[1 ], {eggs: 2})
E202: spam(ham[1], {eggs: 2 })

E203: if x == 4: print x, y; x, y = y , x
E203: if x == 4: print x, y ; x, y = y, x
E203: if x == 4 : print x, y; x, y = y, x

また、私は実際に Textmate を使用したことはありませんが、emacs の flymake モードに似たオンザフライ チェックを行っている場合、ファイルの古いバージョンで pep8 が呼び出されている可能性があり、問題が発生する可能性があります。ファイルを保存すると消えます。さらにデバッグするには、さらに情報が必要になる場合があります。

リスト内包表記自体のフォーマットについては、この他の SO の質問、Google スタイル ガイドからの引用を参照してください。私は個人的にあなたがそれをした方法に問題はありません。次のようなこともできると思います

def _question_tuple(q):
    return (
        q,
        q.vote_set.filter(choice__exact='Y'),
        q.vote_set.filter(choice__exact='N'),
        request.session.get(str(q.id))
    )

question_tups = [_question_tuple(q) for q in questions]

しかし、それは実際には何が最も読みやすく保守しやすいかということであり、それはあなた自身の判断次第です。

于 2011-08-09T02:57:25.737 に答える
0

ジェネレーター式を使用してステートメントを作成することを検討してください。

questions = ((q,
              q.vote_set.filter(choice__exact='Y'),
              q.vote_set.filter(choice__exact='N'),
              request.session.get(str(q.id)),) 
             for q in questions)

さらに、「間違っている」というわけではありませんが、宣言された変数を再定義することはお勧めしません。コードに混乱が生じる可能性があるためです。この場合、questionsインスタンスを別のタイプに変更しています。

于 2011-08-09T01:59:15.167 に答える
0

ツールにもよると思います。E202 が表示されるのはどのツールですか? このpep8ツールをコピーして貼り付けて試してみましたが、エラーは発生しませんでした。しかし、具体的には空白の後questionsにエラーが発生しました。

の E202 は、]その前に空白を見つけていると言います。コードにそれがないことを確認してください。]質問が終わったらすぐに閉じてみてください。

于 2011-08-09T01:40:06.293 に答える