2016-04-11 3 views
6

他の人のプロジェクトからこのコードを理解しようとしています。あなたがしたい場合、それはここにあるコンテキスト:Pythonのメジャーバージョンが2 ある場合https://github.com/newsapps/beeswithmachineguns/blob/master/beeswithmachineguns/bees.py#L501ブール式で文字列を代入する

IS_PY2は私が空でない文字列がTrueであることを知っているが、いくつかの理由のために私は理解していないだけでブール変数、Trueですopenmodeは、TrueまたはFalseではなく、'w'または'wt'のいずれかに割り当てられます。

openmode = IS_PY2 and 'w' or 'wt' 
openkwargs = IS_PY2 and {} or {'encoding': 'utf-8', 'newline': ''} 

誰かが結果を説明できますか?

答えて

7

三元ブール式のように動作します。この表現、そう

>>> 2 and 3 or 4 
3 
>>> 0 and 3 or 4 
4 

Pythonの2になっ
openmode = IS_PY2 and 'w' or 'wt' 

openmode = 'w' or 'wt' 
と同等です
openmode = True and 'w' or 'wt' 

だから、私はwを与えます。

のPython 3の下では、IS_PY2はFalseを、与えている:等価です

openmode = False and 'w' or 'wt' 

openmode = False or 'wt' 

wtを与えます。

このすべて

はOPENMODEはPython2で wとのpython3で wtで示されたテキストファイル、バイナリではない、のためのものであることを明示的に指定することです。

Python3 tモードがデフォルトのモードですが、これを正確にする必要はありません。

this answer about wt modeを参照してください。


最後に、私は次のようにはるかに読み取り可能であることを考える:

openmode = 'w' if IS_PY2 else 'wt' 

そして、はるかに簡単で、この1:

openmode = 'w' 
10

andorオペレーターはしないでくださいオペランドに対してブール演算を実行するだけで、結果はブール値になります。それらの結果は、常にのオペランドの1つです。これらの演算子は左から右へと評価され、orより高い優先順位を持つandがあり、それらは短絡します。つまり、できるだけ早くオペランドの評価を停止します。

純粋なブール論理では、は、xに関係なくFalseであるため、xを調べる必要はありません。 Pythonの式False and xFalseの結果を返し、xの評価を試みません。したがって、False and some_function()ではなく、some_function()となります。 xがさもなければ、True and xTrueあるそのFalseTrueある場合

同様に、純粋なブール論理でTrue and xは、すなわち、x同じ真理値を有するであろう。

しかし、Python and演算子は任意のオペランドを処理できます。

a and baがfalse-ishの場合、bは評価されず、結果はaになります。 aがtrue-ishの場合、bとなり、結果になります。ここ

は、Python 2を使用して、短いデモです:

print False and 'boolean' 
print 0 and 'integer' 
print '' and 'string' 
print [] and 'list' 
print 

print True and 'boolean' 
print 7 and 'integer' 
print 'a' and 'string' 
print [42] and 'list' 
print 

print True and False 
print True and 0 
print True and '' 
print True and [] 
print 

出力

False 
0 

[] 

boolean 
integer 
string 
list 

False 
0 

[] 

(空の文字列が印刷されつつある場合0[]との間のこれらの空白行です)。

同様の考慮事項がorオペレータに適用されます。純粋なブール論理で

True or xは関係なくor式の最初の部分は、我々は第二部を評価する必要はありません本当っぽいの場合はそうである何xTrueではありません。 False or xの真偽値はxです。

print False or 'boolean' 
print 0 or 'integer' 
print '' or 'string' 
print [] or 'list' 
print 

print True or 'boolean' 
print 7 or 'integer' 
print 'a' or 'string' 
print [42] or 'list' 
print 

print False or False 
print False or 0 
print False or '' 
print False or [] 
print 

私が先に言ったように

boolean 
integer 
string 
list 

True 
7 
a 
[42] 

False 
0 

[] 

出力は、これらの演算子は左から右に評価され、私たちが望むならば、我々はそれらをチェーンすることができます。ここでは "古典的な" 例です:

print True and 'yes' or 'no' 
print False and 'yes' or 'no' 

これらのステートメントは、建設は、Pythonの初期のバージョンでは一般的であったことを出力

yes 
no 

print (True and 'yes') or 'no' 
print (False and 'yes') or 'no' 

に相当します。一般andorを使用して三元表現よりも読みやすいと考えられている

print 'yes' if True else 'no' 
print 'yes' if False else 'no' 

:これらの日、それはif表現を見ることがはるかに一般的です。また、a and b or cではなく、bがfalse-ishの場合、b if a else cに相当するではありません。

しかし、特に以前のコードを読んだり維持したりする必要がある場合は、この三元語and ... orの仕組みを理解することが重要です。そして古いPythonistのなかにはまだand ... orという形式が好きですが、それがどういう仕組みか分からないときにはちょっと変わってしまいます。 :)

関連する問題