2011-08-09 10 views
3

私は"List Comprehensions"をPythonで学んだだけです。これらのうちのいくつかは単一の行(PEP8)には長すぎて、これらを解消するための最良の(最も読みやすい)方法を見つけようとしています。Pythonの適切なコードの書式設定(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

で、]前の空白について不平を言います。

+0

コードをチェックするためにどのツールを使用していますか?パイリント? – monkut

+0

pep8 textmate bundle – jondavidjohn

+1

pep8に興味があるなら 'choice__exact'を' choice_exact'にする必要があります。ところで、私は、複数行のリスト内包表記についてはあまり気にしません。ただ読めるようにしてください。 – JBernardo

答えて

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チェッカーについて心配しないでください。かっこと括弧を別々の行に置くことで得られる余分な空白が本当に好きなら、それをしてください。それはそれを "悪いコード"にしたり、読みやすさを低下させたりしません。

+0

そうですね、私はちょうどPythonの初心者なので、これらを壊すより良い方法があるかどうか分からず、gitから質の高いコードを書きたいと思っています。 – jondavidjohn

+0

それのために別の行がうまくいくとは思わない。これは正しいと感じます。 – gorlum0

0

ツールに依存しています。どのツールがあなたにE202を与えていますか?このpep8ツールを貼り付けて試したところ、エラーは発生しませんでした。しかし、私は具体的には、questionsの後に空白があり、エラーが発生しました。

]のE202は、その前に空白があることを示しています。コード内にそれがないことを確認してください。すぐに]を閉じてみてください。

+0

コードブロックの中にあるので、空白があります。 – jondavidjohn

+0

コードブロック内でどのように扱われますか? –

+0

彼はその行がインデントされていることを意味します。これは実際には改行が空白であるため重要ではありません。 – agf

0

generator expressionを使用して明細書を作成することを検討してください。

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インスタンスを別のタイプに変更しています。

+0

新しい 'questions'オブジェクトを1回だけ反復する必要がある場合は、ジェネレータ式を使用してください。これはジェネレータ表現にはまったく適していないと思います。 – agf

+0

はいコンテキストが重要です。正しい状況では、結果がより意味を持つまで、多くのメソッド呼び出しを延期することができるため、ジェネレータはより良い原因になります。 – cmcginty

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のフライメイクモードに似たフライチェックを実行すると、古いバージョンのpep8が呼び出されている可能性もあり、ファイルを保存すると問題が解決する可能性があります。デバッグにはさらに情報が必要な場合があります。

リストの理解そのもののフォーマットについては、this other SO questionthe take from the Google style guideを参照してください。私は個人的にあなたがそれをやったやり方には何の問題もありません。

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] 

などがありますが、実際には最も読みやすく保守性の高いものがあります。それは自分の判断に委ねられています。

+0

彼は ')'と ']'の前に空白/改行をはっきりと持っています。これは彼のツールのルールに違反します。 – agf

関連する問題