2012-12-21 5 views
1

중첩 된 방법을 쓰기에 한 줄과 같은 경우 - 다른는 경우 - 다른 한 라이너

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

다음 중첩? 외부 경우 - 다른 사람이 사건에 대한뿐만 아니라, 일반적으로 복잡한 표현식 구문을 작성하는 방법을 설명해주십시오

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

먼저 평가됩니다; 위의 '아름다움'의 컴파일 된 바이트 코드를 참조하십시오하지 commit에서 발견, 그것은 명령 (48) 및로드 '<no parent>'로 이동합니다 전혀 commit['parent'] 보지

>>> 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' 경우입니다.

줄이 얼마나 읽기 쉬운 지 모르겠지만 명시적인 버전을 훨씬 쉽게 이해할 수 있습니다.

+0

+1. 감사. 네, 깨끗하지는 않지만 알고 싶었어요. 간단한 if-else는 괜찮습니다. 이해하기가 더 어려워 보입니다. Summa summarum :'()'에 개별 if-else 쌍을 래핑합니다. – Flavius

관련 문제