토요일, 3월 02, 2019

[B급 프로그래머] (파이썬) 사용하지 않는 기능조차 여러분을 깨물 수 있다

지난번 자바스크립트 문제에 이어 오늘은 파이썬 공부를 하다가 찾은 재미있는 글이 있어 독자 여러분들께 소개한다. 먼저 다음 코드의 실행 결과는 무엇일까?

  1. 42를 출력
  2. SyntaxError 42행
  3. KeyError 3행

다행히 이번에는 바로 맞추긴 했는데, 이 문제를 풀려면 파이썬 3.6에 대해 조금 알고 있어야 하는 내용이 있다. 바로 '타입 힌트'다. 타입 힌트는 프로그래머들이 변수에 주석을 달아 IDE, 문서 생성기, 정적 분석기와 같은 도구가 활용하게 만드는 기능이다. 그렇다면 위 문제와 타입 힌트가 어떤 상관이 있을까?

타입 힌트를 달기 위해서는 "x: int"와 같은 형식을 따른다. 개발자가 x를 int라고 지정했으므로 타입 검사를 진행하는 정적 분석기가 상당히 정확하게 문제(예: x에 문자열을 대입하는 경우)를 찾아낼 수 있게 된다. 이제 "ages['John']: 42"에 주목하자. 파이썬은 ages['John']의 타입을 42로 정의한다. 타입이 42라고??? 말이 안 되지 않은가? 하지만 애노테이션 표현식에 따르면 대입 가능한 타겟이면 그냥 받아준다(헉!). 따라서 컴파일러는 아무 일도 하지 않고 넘어가버린다. 결국 ages 딕셔너리에는 'John'이라는 키에 대응하는 값이 없기 때문에 KeyError가 발생하게 된다.

수정 내역은 이미 아시겠지만, 그래도 완결성을 위해 실어놓았다.

보너스: 지금 이 모든 가정은 파이썬 3.6 이상을 가정한다. 만일 파이썬 2의 경우라면 어떻게 될까? 이미 답을 알고 계시겠지만 그래도 한 번 더 생각해보면 좋겠다.

EOB

댓글 없음:

댓글 쓰기