2016-04-28 3 views
-4

ユーザは、例えば、ウェブAPIにXクエリのparamsを提供することができる:Pythonでは、1つの値だけを保証する方法は本当ですか?

param_a

param_b

param_c

param_a = self.req.params.get('param_a', None) 
param_b = self.req.params.get('param_b', None) 
param_c = self.req.params.get('param_c', None) 

を所与のクエリPARAMは、その値が提供されていない場合Noneです。

少なくとも1つ以上、または複数のパラメータを指定する必要があります。

Python 3では、1つ以上のパラメータが提供されていることを確認する効果的な方法はありますか?

答えて

2

sum(x is not None for x in (param_a, param_b, param_c)) == 1 

True1の値を有するので、合計はNoneないパラメータの数です。

+0

私はこの回答の簡潔さが気に入っていますが、私はスキムを読む際のロジックを理解するのが少し難しいと認めなければなりません。つまり、「x is not None」は、[True、False、True]を返す[xは(a、b、c)のxに対してNoneではない]のようなリスト内包であることを意味します。私はうまくいく方法が好きですが、ただちに一目瞭然ではないと言っています。スマートではないので、一目瞭然なコードを探す傾向があります。私はあなたの解決策と一緒に行くかもしれません。 [(a、b、c)のxの[(xはNoneではありません)]は、私にはちょっと読みにくいです。 –

+0

他の言語、例えば 'Java'や' C# 'のように'(a、b、c)] 'に' [(xはNoneではない)]を書くことができますが、** Python **では書きません。 ;)。 Ignacioの答えのような形式は、私の意見では – qvpham

+0

@julivico興味深いですが、私は明示的な方が暗黙的よりも優れていると思っていたでしょうし、 "(xはNoneではありません)"の括弧がより明示的であると思います。私はそれが個人的な好みだと思う。 –

0

@Ignacio Vazquez-Abramsはまともな答えがあります。また、フィルタリングされたリストの長さを確認することができます。

if len([p for p in (param_a, param_b, param_c) if p]) != 1: 
    print("Invalid.") 

あなたがのparamsのリストを持つことが起こった場合でも、短くされるであろう:

if len([p for p in params if p]) != 1: 
    print("Invalid.") 
+0

パラメータが0、 ''、[]などのfalse-ish値を持つことができる場合、これは機能しません。 –

0

設定されているどのように多くの? 設定されているすべてのもののリストを作成し、それがどのくらい参照:そう、

len([p for p in (param_a, param_b, param_c) if p != None]) == 1 

それはイグナシオの答えのようなものだが、これは暗黙的に整数に真キャストし、それを合計するに依存しません私は、何かの合計ではなく、リストの長さを見つける意図が少しはっきりしていると思います。

は、[@午後-2ringなど?a=foo&b=&c=barとしてクエリ文字列が合理的にb=''になる可能性があり、「空の文字列に設定」ではなく「設定されていない」として、私の元のチェックがbを数えていたことを処理するためにより示唆されるよう編集]。

+0

パラメータが0、 ''、[]などのfalse-ish値を持つことができればうまくいかないでしょう。 –

+0

合意しましたが、これはWeb APIであり、HTTPリクエストのパラメータはすべてテキストになりますか? – TessellatingHeckler

+0

Hmm。ええOK。しかし、空の文字列は有効なパラメータであり、 'None'とは異なる扱いが必要な場合があります。 –

関連する問題