web-dev-qa-db-ja.com

チェーンメソッドは、インデントスタイルをPython

PEP-8を読んで、関数呼び出しの最後の引数と同じ行に閉じ括弧を置くべきだとわかりました。

ShortName.objects.distinct().filter(
    product__photo__stockitem__isnull=False)

おそらく、長い表現は避けるべきです。しかし、それが望ましくない場合は、複数のチェーンされたメソッド呼び出しについてどうしますか?閉じ括弧は新しい行にあるべきですか?

ShortName.objects.distinct().filter(
    product__photo__stockitem__isnull=False
).values_list('value', flat=True)

引数なしの方法はどうですか? 中間戻り値を参照せずに複数行に書き込む方法は?

ShortName.objects.distinct(
    ).filter().values() # looks ugly

UpdatePythonでチェーンメソッドの行を分割するには? の重複した質問があります。 承認された回答 は、jQueryスタイルからおなじみの各行をドットで開始することを示唆しています。著者は理由や権威ある参考文献を提供していませんので、そのようなスタイルや代替案について確認したいと思います。

90
katspaugh

これは、括弧を開くよりも行継続文字が優先される場合です。

ShortName.objects.distinct() \
         .filter().values()      # looks better

このスタイルの必要性は、メソッド名が長くなり、メソッドが引数を取り始めるにつれて明らかになります。

return some_collection.get_objects(locator=l5) \
                      .get_distinct(case_insensitive=True) \
                      .filter(predicate=query(q5)) \
                      .values()

PEP 8は、常識の尺度と実用的で美しい両方の目で解釈される予定です。 EPいコードや読みにくいコードをもたらすPEP 8ガイドラインに喜んで違反します。

とはいえ、PEP 8と頻繁に対立する場合は、空白の選択を超える読みやすさの問題がある可能性があります:-)

150

()を使用して強制的にラインを結合し、これを行うのが最善だと思います:

(ShortName.objects.distinct() # Look ma!
 .filter(product__photo__stickitem__isnull=False) # Comments are allowed
 .values_list('value', flat=True))

それは理想的ではありませんが、視覚的に際立っており、呼び出しの連鎖が何であるかをある程度明らかにすることが好きです。行末コメントを許可しますが、\改行は許可しません。

53
user97370