2016-12-22 5 views
0

特定のif文を満たすためには、かなり長い条件リストがあります。 私はデバッグして、どの条件が満たされているかを知ることができませんでした。各条件を個別にテストするよりも良い方法はありますか?Pythonをデバッグして、どの条件が真であるかを確認します。

if (xpr1 or xpr2 or xpr3 .......): 
    print "xpr# was true" 

より優れています。

 print "all variables" from true condition 

のPython 2.7

+0

['any(xpr1、xpr2、...)'](https://docs.python.org/3.5/library/functions.html#any)についてはどうですか?デバッグするには '(xp1、xpr2、...) 'の中で' [bool(x)for x]を使うことができます。 –

+0

@hiro all()は、すべての要素がTrueであればTrueを返し、少なくとも1つの要素がTrueであればUserZer0からの(...)がTrueを返します。 – Humbalan

+0

@Humbalanはい、ちょうど気づいて修正しました。 –

答えて

2
>>> a = False 
>>> b = True 
>>> c = False 
>>> print [name for name in ['a', 'b', 'c'] if locals()[name]] 
['b'] 
+1

また、引用符やカンマの入力が多くの変数に対して迷惑になる場合は、代わりに '' a b c'.split() 'と書くことができます。 –

+0

@AlexHallあなたのご意見は、この回答の有用性を大幅に改善します!それについて考えなかっただろう! – UserZer0

+0

または、それらが単一文字の名前であるため、 'list( 'abc')'です。 – Rob

2

あり、個別に各条件をテストするよりも任意のより良い方法は、実際にはありませんが、リスト内包でコンパクトにそれを行うことができ、例えば:

conditions = (xpr0, xpr1, xpr2, xpr3) 
print [i for i, xpr in enumerate(conditions) if xpr] 

真である式のインデックスのリストを出力します。しかし、これはあなたがorで得る短絡を実行しません。もちろん

、あなたは、break声明で、「伝統的な」forループを使って、例えば短絡を強制することができます。

for i, xpr in enumerate(conditions): 
    if xpr: 
     print i, xpr 
     break 

これは短絡行わとまったく同じではありませんが、

if xpr0 or xpr1 or xpr2 or xpr3: 

conditionsリストのすべての式が既に事前計算されているためです。ヒロの主人公はコメントで言及したよう


、あなたはそれらの式のいずれかが

any(conditions) 

に該当するかどうかをテストすることができ、伝統的なforループと同じようにそのます短絡上のコード。

FWIWは通常、短絡ポイントに達した後に不要な式の評価を避けるため、リスト作成者ではなくジェネレータ式にanyallを使用しますが、ここでは該当しません。

関連する問題