2012-12-21 42 views
1

如何寫下面的嵌套的if-else嵌套的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>' 

請描述如何將其語法編寫複雜的表達式,通常,不僅對於這種情況。但是請使用這個例子作爲展示。

回答

3

是的,如果你與外結合「內部」表達你的代碼將作爲一個班輪:

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

的外表達的if先求;看到上面的「美」的編譯的字節代碼:

>>> 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'commit發現,它會跳轉到指令48和負載'<no parent>'commit['parent']不看的。

不知道該行的可讀性如何,我發現你的顯式版本更容易理解。

+0

+1。謝謝。是的,它不乾淨,但我只是想知道。一個簡單的if-else可以,更難以理解* Summa summarum:*在'()'中包裝單個if-else對。 – Flavius