1

次のネストされたif-elseの書き方

        if 'parent' in commit:
            if commit['parent'] == cid-1:
                parent = '    '
            else:
                parent = commit['parent']
        else:
            parent = '<no parent>'

ワンライナーとして?外側のif-elseは次のように書くことができます

parent = commit['parent'] if 'parent' in commit else '<no parent>'

この場合だけでなく、一般的に複雑な表現のために構文的にそれを書く方法を説明してください。ただし、この例をショーケースとして使用してください。

4

1 に答える 1

3

はい、「内側」の式を外側の式と組み合わせると、コードはワンライナーとして機能します。

parent = ('    ' if comment['parent'] == cid-1 else commit['parent']) if 'parent' in commit else '<no parent>'

if外側の式の が最初に評価されます。上記の「beauty」のコンパイル済みバイトコードを参照してください。

>>> import dis
>>> def foo():
...     parent = ('    ' if comment['parent'] == cid-1 else commit['parent']) if 'parent' in commit else '<no parent>'
... 
>>> dis.dis(foo)
  2           0 LOAD_CONST               1 ('parent') 
              3 LOAD_GLOBAL              0 (commit) 
              6 COMPARE_OP               6 (in) 
              9 POP_JUMP_IF_FALSE       48 
             12 LOAD_GLOBAL              1 (comment) 
             15 LOAD_CONST               1 ('parent') 
             18 BINARY_SUBSCR        
             19 LOAD_GLOBAL              2 (cid) 
             22 LOAD_CONST               2 (1) 
             25 BINARY_SUBTRACT      
             26 COMPARE_OP               2 (==) 
             29 POP_JUMP_IF_FALSE       38 
             32 LOAD_CONST               3 ('    ') 
             35 JUMP_ABSOLUTE           51 
        >>   38 LOAD_GLOBAL              0 (commit) 
             41 LOAD_CONST               1 ('parent') 
             44 BINARY_SUBSCR        
             45 JUMP_FORWARD             3 (to 51) 
        >>   48 LOAD_CONST               4 ('<no parent>') 
        >>   51 STORE_FAST               0 (parent) 
             54 LOAD_CONST               0 (None) 
             57 RETURN_VALUE         

したがって、がに見つからない'parent'場合は、命令 48 にジャンプしてロードし、まったく見ません。commit'<no parent>'commit['parent']

行がどれほど読みやすいかわかりませんが、明示的なバージョンの方がはるかに理解しやすいと思います。

于 2012-12-21T16:54:55.047 に答える