이전 연재 보기
오늘은 파이썬 2.5에서 가장 논란이 될 만한 부분인 PEP-308 Conditional Expressions에 대해 알아보겠습니다.
C의 ? : 이른바 삼항연산자라고 부르는 그 놈은 C에서 파이썬으로 넘어오는 개발자들이 항상 목말라하는 그런 것이었습니다. 그래서, 궁한대로
1 2 3 4 |
1) a == b and 1 or 0 2) [0, 1][a == b] 3) (a == b and [1] or [0])[0] 4) {True: 1, False: 0}[a == b] |
등 별 희한한 방법을 다 쓰고 있었지만, 1번은 제약사항이 있고, 2,3,4번은 눈에 확 들어오지 않는다는 치명적인 문제가 있어서, 결국은 if: else: 해서 4줄로 나눠써야 했었습니다.
이 문제 해결을 위한 여러 사용자들의 꾸준한 요청으로 귀도가 드디어 투표를 하기로 결심해서, 2003년에 투표를 해서 결정이 되긴 했지만, 여러 분파로 나뉘어서 그 후에도 좁혀지지 않는 의견차로 인해서 실행이 될 기미가 보이지 않았습니다. 그래서 결국 1000000표를 행사하는 귀도가 모든 사람이 상상도 못했던 희한한 문법을 들고 나와서 그걸로 결정해 버렸습니다. (이런 일은 print >> None 때도 다들 황당했었지요.. ;;)
결정 문법: X if COND else Y
X가 맨 앞에 나오지만 X가 먼저 해석되지도 않을 뿐더러, COND가 중간에 숨겨지고, X와 Y가 떨어져있는 등 귀도 외에는 좋아하는 사람이 거의 없는 듯 했지만, 어쨌거나 이 문법으로 결정이 되었습니다. 그 문제는 구현까지 완료돼서 들어오고 나서 더욱 더 강조가 되게 되었는데,
1 |
text = data if logging else '' |
이렇게 쓰면 다른 언어들의 if, else 문법들의 영향으로 다음 중 어느 것으로 해석되는지가 굉장히 헷갈립니다.
1 2 |
1) (text = data) if logging else '' 2) text = (data if logging else '') |
물론, 파이썬에서는 1번이 기본 구조로 불가능하기 때문에 2번이 정답이기는 하지만, 다음과 같이 꼭 띄어써야 하는 부분이 아니면 안 띄어쓰는 (약간은 ㅂㅌ스러운 ㅎㅎ;) 코딩 컨벤션을 쓰는 사람이라면 훨씬 더 난감해집니다.
1 |
text=data if logging else '' |
으흐흐.. 하여간, 이 문법이 과연 파이썬 3.0까지 살아남을 수 있을지 두고 봐야겠습니다. “print >> file” 처럼 처음에는 다들 굉장히 싫어했지만, 결국에는 다들 익숙해져버리는 쪽으로 될 지도 모르겠고요..
띄어써야 하는 부분이 아니면 안 띄어 쓰는 코딩 컨벤션이라면 text=data if logging else”라고 하지 않나요? -.-
엇.. else 뒤에 안 띄우면 에러 나는데용.. 흐흐 -O-