2016-11-14 4 views
1

私はpythonとdjangoの初心者です。今は、if ..else文を1行に記述する際のコードを単純化する方法を学んでいます。これはif..elseステートメントを1行に書く方法ですか?

しかし、この場合私は少し変更した2つのクエリーセットを持っています。 私はそれが1行で

if self.booked: 
    x = qs.filter(content_id=content_id, object_id=model.id, action=10) 
else: 
    x = qs.filter(content_id=content_id, object_id=model.id).exclude(action=10) 
return x 
+4

"pythonic"コードの全体のポイントは、それが明確で読みやすいということです。 IMOには、これを1行に書く方法がありません。あなたはそれが明快で読みやすいと主張することができるので、私はそれをそのままにしておきます。ヒントは、コードの各行を80文字以内に収めることです。 – steve

答えて

0

共通する部分がある場合の外にあるので、私はそれを修正してくださいだろうしかし、特にアクション10はハードコードされているため、かなり謎めいています。少なくとも、明確な名前の定数を定義する必要があります。

編集:うわー、これは実際には間違っています。なぜなら、あなたがcontent_idでフィルタリングしていれば、もう一方はcontent_type_idでフィルタリングしているからです。それは私のバグかあなたですか?少なくともあなたのコードは読みにくいという証拠です...

+0

'return(self.booked else qs.excludeならばqs.filter(action = 10)')を使ってもう少し繰り返しをなくすことができます。 – TigerhawkT3

+0

@ TigerhawkT3:よく目に付きますが、それをプロダクションコードで書いてください。 – RemcoGerlich

+0

@RemcoGerlich - 当時の気分にかかっています。 :) – TigerhawkT3

0

をこのコードをsimlifyすることが可能である場合、これは可能ですが、読み結果はハードになるかを知りたい:

return qs.filter(content_id=content_id, object_id=model.id, action=10) if self.booked else qs.filter(content_id=content_type_id, object_id=model.id).exclude(action=10) 
+0

あなたの迅速な対応に感謝します。しかし、クエリーセットはほぼ同じです。わずかな違いがあります。コードを複製しない方法はありますか? – rahma

0

if self.booked条件が非常に重要になりますと、それはですそれがあなたのコードの中で際立つようにすることが望ましいでしょう。

しかし、あなたは簡素化したい場合は、クエリの共通部分を抽出することができが設定されます:

qs = qs.filter(content_id=content_id, object_id=model.id) 
return qs.filter(action=10) if self.booked else qs.exclude(action=10) 

qs = qs.filter(object_id=model.id) 
if self.booked: 
    qs = qs.filter(content_id=content_id, action=10) 
else: 
    qs = qs.filter(content_id=content_type_id).exclude(action=10) 
return qs 
関連する問題