Type casting in Python

오픈 소스 프로젝트를 하나 시작했습니다. Typeable 이라는 것인데 파이썬에 타입 캐스팅을 도입하는 것을 목표로 하고 있습니다.

파이썬에 타입 캐스팅이 아예 없는 것은 아닙니다. 가령 int(3.14) 같은 표현은 사실상 float 형을 int 형으로 바꾸는 타입 캐스팅입니다. set([1,2,3]) 도 마찬가지입니다. 이처럼 파이썬의 타입(혹은 생성자)은 하나의 인자를 제공할 때 타입 캐스팅 연산자 역할을 하는 경우가 많습니다만, 반드시 그런 것은 아닙니다. bytes(10) 은 타입 캐스팅이라고 보기에는 무리가 있는 걸과를 줍니다.

타입 캐스팅은 변환(conversion)을 수반합니다. 3.143 으로 바꾸는 것이 변환의 예로 충분하지 않다면 int("2021") 을 생각해보십시오. 이런 변환이 원하는 것이 아닐 경우도 있는데, 가령 str(b'hello') 는 디코딩하는 대신 "b'hello'" 를 돌려줍니다.

타입 캐스팅은 검사(validation)도 수반합니다. int(None) 처럼 변환이 불가능하면 TypeError 를 일으킵니다. 이 역시 언제나 상황에 맞지는 않습니다. 가령 bool 이나 str 은 거의 예외를 일으키지 않습니다. (사실 일부러 그렇게 만드는 경우를 빼고는 당장 생각나는 경우가 없습니다.) 또 앞의 str(b'hello') 과는 달리 그 반대인 bytes('hello')TypeError 를 일으킵니다.

이 처럼 파이썬에 타입 캐스팅이 부분적으로 지원되기는 하지만, 일관성이 결여되어 있습니다. 즉 타입 캐스팅을 언어 기능으로 일관되게 지원하려는 의도가 없었다는 뜻입니다. 또 한가지 문제는, 얕은(shallow) 타입 캐스팅만 지원할 뿐, 깊은(deep) 타입 캐스팅을 지원하지 않는다는 것입니다. 파이썬의 컨테이너 형들에 대해 앝은 복사를 지원하는 copy.copy() 와 깊은 복사를 지원하는 copy.deepcopy() 가 표준 라이브러리에서 제공되고 있지만 타입 캐스팅에는 이런 지원이 없습니다. 예를 들어 봅시다. val 을 키가 문자열이고 값이 정수의 리스트인 딕셔너리로 변환한다고 합시다. 아마 다음과 같이 작성할 수 있을겁니다:

{str(k): list(map(int,v)) for k, v in val.items()}

이 코드가 변환이 가능한 경우를 일부 놓치는 문제는 제외하더라도, 자료 구조를 코드로 매변 옮겨 적어야 한다는 것이 더 큰 문제입니다. 뭔가 더 좋은 방법이 있어야만 합니다. 그렇게 믿는 이유는 이미 파이썬에서 "키가 문자열이고 값이 정수의 리스트인 딕셔너리" 라는 표현을 코드로 나타내는 방법을 제공하고 있기 때문입니다. dict[str,list[int]] 가 그 표현입니다. (3.9 이전 버전에서는 이 표현은 허락되지 않습니다. 대신 typing.Dicttyping.List 를 사용해서 Dict[str,List[int]] 라고 적어야 합니다.) 저는 예전에 주석으로 {str:[int]} 라고 적어놓고는 했습니다만, 파이썬 표준 방식은 조금 더 장황한 양식을 요구합니다. 어쨌거나 이것도 꽤 직관적이고 간결합니다. 자 그러면 혹시 dict[str,list[int]](val) 하면 될까요? 에러는 발생하지 않습니다만, 결과는 원하는 결과가 아닙니다. dict(val) 한 것과 정확히 같은 결과입니다. 다시 말해 dict[str,list[int]] 라는 표현은 형 어노테이션으로는 쓸모가 있지만 런타임 환경에서는 dict 와 동작이 같습니다.

typing 을 좀 더 살펴보면, typing.cast() 라는 함수가 있습니다. 설명을 조금 보면 이게 바로 우리가 원하는 것입니다. 값을 지정한 형으로 변환한다네요. 하지만 더 읽어보면 형 검사기에 정보를 주기위한 용도로 사용될 뿐, 런타임 환경에서는 값을 그냥 반환한다고 합니다. 자 이것이 typing 모듈의 현 상황입니다. 형 어노테이션과 형 검사기를 지원하지만 런타임 환경에서는 그리 쓸모 없는 모듈. 과연 그럴까요?

형 어노테이션이 런타임 환경에 조금씩 스며들고 있습니다. functools.singledispatch() 를 보십시오, 비록 대안을 제공하고는 있지만 첫번째 인자의 형 어노테이션을 확인합니다. dataclasses 를 보십시오, 이 모듈은 형 어노테이션을 하지 않고는 아예 쓸 수도 없습니다. typing.get_type_hints() 함수는 런타임 환경에서 이런 기능들을 구현하는데 쓸 수 있는 아주 강력한 도구입니다.

그래서 시작했습니다. 런타임 환경에서 동작하는 typing.cast() 를 만들자. 이제 겨우 부분적이나마 동작하는 버전이 나와서 공유합니다. 그래서 앞에서 예로 든 변환은 이제 이렇게 수행할 수 있습니다:

cast(dict[str,list[int]], val)

앞으로 나눌 이야기가 많으니 오늘은 이만 합니다.

Typeable 의 설명서는 https://typeable.flowdas.com 에 있습니다. 설치하려면 pip install typeable 하시면 됩니다.

도널드 크로허스트의 기이한 마지막 항해

도널드 크로허스트의 기이한 마지막 항해 - 8점
니컬러스 토멀린 & 론 홀 지음, 박여영 옮김/클

1968년 10월 31일 영국. 단독 세계 일주 요트 경주에 도널드 크로허스트가 도전합니다. 오직 혼자, 외부의 도움이나 중간 기착 없이 자신의 요트로 망망대해를 일주해야 합니다. 외부와 완전히 단절된 것은 아니고, 라디오, 전신, 전화가 있습니다. 공인된 경험도 없고, 부실한 준비로 출발부터 불안했던 크로허스트는, 얼마 후 하루 주행 거리 신기록을 수립했다는 놀라운 소식을 전해옵니다. 어느덧 경쟁자들이 하나둘 탈락하면서 유력한 우승 후보로 떠오릅니다. 하지만 연락이 끊기고 이듬해 7월 10일 엉뚱한 장소에서 표류 중인 빈 배가 발견됩니다. 무슨 일이 있던 것일까요? 그 배에 남아있는 일지, 녹음, 비디오테이프에서 드러난 진실은 떠들썩한 스캔들을 일으킵니다. 자신의 거짓말에 익사한 한 남자의 이야기는 어둡기보다는 서글픕니다.

틀리지 않는 법

틀리지 않는 법 - 10점
조던 앨런버그 지음, 김명남 옮김/열린책들

매혹적인 제목이다. 틀리고자 작정한듯한 사람들이 연일 매스컴을 장식하지만, 그래도 우리 모두의 본성에는 틀리지 않고자 하는 바이 들어있다고 믿고 싶다. 저자가 알려주는 비결은 "수학적 사고" 다.

저자 자신이 수학 신동으로 이름을 날렸으니 독자로서는 기가 약간 죽을 수밖에 없고, 천재들의 자화자찬이 아닌가 할 수 있다. 하지만 그런 이야기가 아니다.

"수학적 사고" 가 어떤 것인지, 왜 이것이 우리를 올바름으로 이끌어주는 도구인지, 천재들의 전유물이 아니라 우리 모두 어떤 식으로 수학을 호흡하고 있는지 탁월한 문장에 약간은 너드스러운 유머를 곁들여가며 설명하고 있다.

무척 재미있지만 쉬운 책은 아니다. 저자가 말하고자 하는 것을 빠짐없이 따라가려면 대학 초년생 수준의 수학은 이해할 수 있어야 할듯하다. 이제 고등학교 들어가는 딸아이에게 읽어주니 전혀 감흥이 없단다. 내가 낄낄거리며 읽었던 부분도 전혀 재미없단다. 하지만 세부 사항을 대충 흘려들으며 읽어도 그리 많은 것을 놓치지는 않을 것 같다. 재미는 조금 줄어들겠지만.

특히 마음을 끄는 구절이 있다.

천재성은 어떤 발생한 사건이지, 어떤 종류의 사람이 아니다.

애시버리의 시에서 인용한 구절도 계속 맴돈다.

왜냐하면 이것은 행동이므로, 이 확신하지 않는 것은.

올해 읽은 최고의 작품이다.

원서는 2015년에 출간된 <How Not to Be Wrong> 이다.

뇌과학의 비밀

뇌과학의 비밀 - 8점
개리 마커스 지음, 김혜림 옮김/니케북스

음악을 좋아하기는 하지만, 재능은 없는 중년의 인지심리학자가, 안식년을 맞아 기타 연주에 도전하는 이야기입니다. 구성 자체는 예전에 소개한 우리는 왜 달리는가 와 비슷합니다. 달리기가 기타 연주로 바뀌었을 뿐, 자신의 실제 경험담을 뼈대로 삼고, 관련된 연구들로 살을 붙입니다. 학습 능력과 관련된 뇌에 관한 연구들이 많이 소개되고, 유명 음악인들을 인터뷰한 내용도 자주 만날 수 있습니다. 물론 기타 연주에 관한 내용도 상세히 다룹니다.

같은 음치이기는 하지만, 그리 음악에 대한 애착이 없는 사람으로서, 이 책을 보고, 이제라도 음악 공부를 해봐야겠다는 생각이 들지는 않습니다. 하지만 다른 분들은 어떻게 느낄지 모르겠습니다. 하지만 확실한 것은, 안식년이 없는 사람들은 꿈도 꾸지 말라는 것입니다. 매주 한 두시간씩 연습하는 것으로는 턱도 없으니까요. 은퇴 후라면 모를까.

저자는 클루지 라는 작품으로 이미 소개한 적이 있는 개리 마커스입니다. 2012년에 출간된 원서의 제목은 <Guitar Zero> 입니다.

악의 꽃 (앙리 마티스 에디션)

악의 꽃 (앙리 마티스 에디션) - 8점
샤를 피에르 보들레르 지음, 앙리 마티스 엮고 그림, 김인환 옮김, 정장진 그/문예출판사

마티스의 그림을 좋아합니다. 보고 있으면 귀에 대고 비밀을 속삭이는 듯한 느낌을 받습니다. 뭔가 느끼고는 있었지만 깨닫지는 못하던 것을 알려주는 숨결.

마티스가 보들레르의 작품에서 뽑은 시에 드로잉을 붙여 펴낸 선집입니다. 원래는 석판화를 준비했다는데, 원화가 망가지는 사고로 포기하고, 전에 찍어둔 사진을 사용해서 영인본으로 300권을 펴냈다고 합니다. 드로잉이기 때문에 전반기의 마티스를 규정하는 야수파다운 원색은 볼 수 없습니다만, 감정은 그대로 살아있습니다.

원숭이 신의 잃어버린 도시

원숭이 신의 잃어버린 도시 - 8점
더글러스 프레스턴 지음, 손성화 옮김/나무의철학

온두라스의 원시림에 "백색 도시"라는 저주받은 도시가 있다는 전설이 있습니다. "원숭이 신의 도시" 라고도 불리는 이곳은 몇몇 탐험가들이 발견했다고 주장했지만 그 진위가 밝혀지지 않았습니다. 한때 번성했으나 신의 저주를 받아 한순간에 몰락하고 지금은 그 토대를 찾을 수도 없는 잊힌 문명.

요즘은 자율주행 차에 자주 쓰이는 라이다라는 신기술의 도움으로, 원시림에 감춰진 비밀이 드러납니다. 이 탐사대에 동반한 <셔널 지오그래픽> 의 특파원이 매혹적인 이야기를 전합니다. 발견의 순간에는 나도 그런 자리에 있으면 좋겠다는 설렘이 듭니다. 하지만 이는 아주 잠깐이고, 독사와 온갖 질병에 몸서리를 치게 됩니다.

아주 매끄럽게 읽히는 책은 아닙니다만, 흥미진진한 이야기들로 가득 차 있습니다.

원서는 2017년에 출간된 <The Lost City of the Monkey God> 입니다.

플라워 문

플라워 문 - 10점
데이비드 그랜 지음, 김승욱 옮김/프시케의숲

해마다 5월이 되면 오세이지 인디언들의 광대한 영토를 뒤덮은 꽃들이 떨어지기 시작합니다. 그들이 5월을 "꽃을 죽이는 달" 이라고 부르는 이유입니다.

오세이지 인디언들은 백인들에게 자신들의 광활한 영토를 뺏기고, 캔자스 남동부로 피신합니다. 이곳에서도 역시 백인 이주민들의 약탈에 견디다 못해, 땅을 판 돈으로 백인들이 눈독을 들이지 않는 불모지를 사서 이주합니다. 그 후 정부와의 협상을 통해 이 땅을 오세이지 인디언들에게 분할하며, 그 밑에 있는 광물 자원에 대한 권리 역시 인정한다는 약속을 받습니다. 그래서 이제 백인들 틈에서 살아갈 수 있는 길이 열린듯했습니다.

하지만, 이 땅에서 유전이 발견되고, 그 결과 갑작스럽게 인디언들이 부유해지고, 다시 비극이 시작됩니다.

이미 잃어버린 도시 Z 로 한번 소개한 데이비드 그랜이 작년에 새로 낸 책(Killers of the Flower Moon)입니다. 번역본은 올가을에 나왔습니다. 전작보다 더 뛰어난 논픽션입니다. 치밀한 자료 조사는 물론이고, 추리 소설의 느낌을 받을 정도로 이야기 전개가 흡입력이 있습니다. 후반으로 갈수록 도저히 손에서 놓을 수가 없습니다. 좀 우울해져도 상관없다면 꼭 보세요.

골목길 역사산책 서울편

골목길 역사산책 : 서울편 - 8점
최석호 지음/시루

한국 근대사의 자취가 남아있는 장소들을 중심으로 산책로를 소개합니다. 말이 심하게 많은 가이드처럼 그 주변의 역사를 안내합니다. 이야기가 재미있습니다만, 듣다 보면 산책 중이었다는 것을 가끔 잊게 됩니다. 그래서인지 장마다 지도를 곁들인 요약을 제공하고 있습니다.

부암동, 정동, 북촌, 서촌, 동촌을 차례대로 방문합니다. 이 중 부암동 산책길은 제 산책길이기도 합니다. 좀 멀리 갈 때는 서촌 산책로까지 이어지기도 합니다. 특히 백사실 계곡은 추사 김정희의 별서 정원이 있던 자리인데, 여름에는 아이들 데리고 배드민턴 치면서 놀다 오던 곳입니다. 예능 프로그램에 소개된 이후로는 오히려 자주 찾지 않게 되네요. 저자도 이곳에 있던 연못과 정자가 사라진 것을 안타까워하면서, 1935년에 동아일보에 실린 사진을 인용하고 있는데, 아주 최근까지도 있었다는 것을 조사하지는 못한듯합니다. 지역 주민이다 보니 부암동 편은 제가 이 책을 평가하는 시금석 역할을 합니다. 산책로에서 소개하는 곳들은 대체로 널리 알려진 것들입니다. 이곳을 아주 잘 알고 있는 가이드라는 느낌은 나지 않지만, 그곳에 얽힌 이야기들이 보충합니다. 한 번쯤 이 책 들고 걸어보면 재미있을듯합니다.

이런 기획의 책이 처음은 아닙니다. 이 블로그에서도 2010년에 "옛 지도를 들고 서울을 걷다"라는 책을 소개한 적이 있습니다.

덧붙이자면, 저자, 출판사, 서점들이 밝히지 않는 내용이 있습니다. 2015년에 출판된 골목길 근대사 라는 책이 있습니다. 이 책의 지은이인 "최석호" 외에도 두 명의 공저자가 같은 출판사에서 펴냈는데, 정동, 서촌, 동촌에 대한 내용이 이 책과 겹칩니다. 자세히 비교해보면, 이 책을 "골목길 역사산책" 이라는 두 권의 책으로 확장한 증보판입니다. 나머지 두 저자가 사라진 것으로 보아, 아마도 "최석호" 씨가 주저자였던 것이 아닐까요? 혹 아니었다 하더라도 증보한 내용(가령 각 장에 상당량의 내용이 추가되었고, 부암동과 북촌은 새로 더해진 장입니다)은 상당합니다. 두 권으로 나눴다고 했는데, 이 책은 "서울편" 외에도 "개항도시편" 이 더 있습니다. "개항도시편" 도 다음에 소개할 기회가 있지 않을까요?

황금방울새

십 년에 한 번씩 세상에 나와 문학상을 쓸어가시는 분이 있다. 도나 타트. 그녀의 세 번째 소설이다.

소년 시오는 미술관에서 폭탄 테러로 엄마를 잃고, 자신은 큰 상처 없이, 얼떨결에 전시되어 있던 카렐 파브리티우스의 <황금방울새>라는 작은 그림을 들고나오게 된다. 이후로 상실, 집착, 선택, 유약함의 파노라마가 펼쳐진다. 일단 무지하게 재미있으면서도, 문장, 플롯 어느 하나 부족한 부분이 없다. 디킨스 적이라는 평들이 있는데 올리버 트위스트나, 데이비드 코퍼필드처럼 성장 소설이라는 점, 상당히 많은 등장인물들이 우연으로 얽혀들어 가는 것, 중심 플롯 주변의 잔가지가 무성하다는 점이 비슷하다. 그리고 작품이 무척 길다.

<황금방울새>라는 그림은 네덜란드 화가 카렐 파브리티우스의 1654년 작품인데, 같은 해 파브리티우스는 화약 공장 폭발 사고로 사망한다. 묘한 겹침이다. 이 그림의 크기가 A4 용지보다 조금 큰 정도라는 것을 기억해두면 좋다.

출판사의 광고를 보면 "완독률 98.5%의 압도적 1위"라는 구절이 있다. 완독률 98.5%? 가능한 소린가? 찾아보니 호킹 지수라는 것인데 "아마존 킨들을 통한 완독률"이라고 출판사는 소개하고 있다. 마치 1,000명이 시작하면 15명 빼고 모두 끝까지 읽는다는 뜻으로 들리는데, 좀 믿기 어려운 소리다. 다른 식으로 해석할 수도 있겠다. 전부 1,068쪽의 책을 평균 1,052쪽까지 읽는다? 이 역시 믿기 어려운 것은 매 한가지다. 호킹 지수 98.5%는 완독률과는 아무 상관 없는 숫자다. 아마 책의 끝부분에서 깊은 인상을 받은 독자들이 많다는 뜻이리라.

리틀 드러머 걸

리틀 드러머 걸 - 8점
존 르 카레 지음, 조영학 옮김/알에이치코리아(RHK)

박찬욱 감독의 연출로 만들어지는 동명 드라마의 원작 소설이라, 요즘 유명세를 타고 있다. 이 책을 집어든 이유도 다르지 않다. 아이고 더 미루면 안되겠구나. <나이트 매니저> 처럼 일단 드라마를 먼저 보고나면, 책을 읽을 기회는 없어진다. 책장 가득 쌓여있는 다른 책을 미루고 볼 이유가 있을까?

스파이물의 극 사실 주의 작가 <존 르 카레>의 작품은 이 블로그에 5번째 소개된다. 작품 수가 스무편이 넘으니 아직도 많이 남았다. 분량도 넉넉하고, 농도도 높아서 읽고 나면 포만감이 좋다. 작전을 준비하는 1부만 390쪽이다.

이스라엘 정보기관이 팔레스타인 테러 조직을 잡기 위해 여배우를 포섭하는 내용. "테러리스트 잡는 정의의 사도" 가 등장하는 것은 아닐지 걱정하지 않아도 된다. 대신 나무 등걸의 주름하나, 붙어있는 벌레 하나까지 모두 그려낸다. 그래서 극 사실 주의고, 그래서 추악함의 선명한 이미지를 얻을 수 있다.