11

パッケージのソースコード(具体的にはザル)でいくつかの答えを探しているときに、理解できない文字列に出くわしました。また、私のPyCharmは、「ステートメントは効果がないようです」と眉をひそめています。

コードの要約は次のとおりです。

...
for path in e.paths():
    keyparts = []
    msgs = []
    for exc in path:
        exc.msg and msgs.extend(exc.messages()) # <-- what is that?
        keyname = exc._keyname()
        keyname and keyparts.append(keyname) # <-- and that
    errors['.'.join(keyparts)] = '; '.join(interpolate(msgs))
return errors
...

それは非常にpythonicのようで、私はそれをマスターしたいです!

UPD。だから、私が見るように、それはまったくpythonicではありません-速記のために読みやすさが損なわれます。

4

3 に答える 3

15

keynameがFalseと評価された場合、andステートメントはすぐにfalseを返し、2番目の部分を評価しません。それ以外の場合は、2番目の部分を評価します(この場合、戻り値は重要ではありません)。したがって、基本的には次のようになります。

if keyname: 
    keyparts.append(keyname)

私が提案したバージョンは(少なくとも個人的には)はるかに読みやすいように見えるので、それが非常にpythonicであるかどうかはわかりません。

于 2012-05-03T23:03:46.773 に答える
3

andおよびorは論理演算子を短絡しています。つまり、Pythonは答えが何であるかを知るとすぐに、残りの句の評価を停止します。

投稿したスニペットでは、と関数andを保護するために使用されています。おそらく、作成者は、たとえばリストに投稿することを望んでいません。.extend().append()None

私は通常、ifステートメントでこの機能を使用します。

if name and name[0] in ('Mr', 'Mrs', 'Ms'):
    ...

nameは空の可能性のあるリストです-空の場合は。で失敗name[0]するので、 -IndexErrorで保護します-空の場合(およびブロック)は実行されず、エラーは回避されます。name andname name[0]if

これは非常にPythonの機能です。

于 2012-05-04T17:06:37.050 に答える
2

Pythonでは、ステートメントの最初の式が2番目の式の前に評価され、最初の式が、 の場合、andインタープリターはステートメントの評価から抜け出します。andFalse

keyname and keyparts.append(keyname)

と同等です:

if keyname:
    keyparts.append(keyname)
于 2012-05-03T23:11:15.363 に答える