Io의 asString, asCharacter 같은 것 덕분에 앞뒤로 왔다갔다 하지 않고도 계속 쓸 수 있다는 점이 참 와닿아서, 파이썬에서는 그렇게 할 수 없을까 하다가, 전에 어떤 분이 파이썬에서 왜 베이스 타입에서는 메쏘드를 못 갈아치우냐 하시길래, “엇 안되나! (뻘쭘)” 했던 기억이 나서 좀 더 연구를 해 보았습니다. 으흐흐
파이썬의 타입 오브젝트의 플래그 중에 Py_TPFLAGS_HEAPTYPE이라는 것이 있는데 이것은 힙에 할당된 타입에만 들어가는 플래그라서, 즉, 런타임에 상속된 타입들은 이 플래그가 설정이 되지만, 컴파일할 때 스택에 할당된 타입 객체들은 이 플래그가 설정되어 있지 않아서 결국 “can’t set attributes of built-in/extension type”라는 에러를 뱉어냅니다. 그런데, 파이썬은 타입 오브젝트가 비록 스택에 있긴 하지만 const가 아니기 때문에 실제로 딕셔너리도 할당을 하는 등 변조를 하고 gc로 관리까지 하고 있어서 변경한다고 문제가 생길 것은 없었습니다. 그래서 그 부분을 패치해서 실험해 보면, (Object/typeobject.c의 type_setattro함수의 첫 if 블럭을 주석처리)
1 2 3 4 5 6 7 8 |
>>> object.asInt = lambda x: int(x) >>> object.size = lambda x: len(x) >>> [1,2,3].size() 3 >>> 'hehehee'.size() 7 >>> '123'.asInt() 123 |
요렇게 잘 돌아갑니다~
과연.. 잘 되는데 왜 파이썬에서는 막아놓은 것일까!
그 이유는 메일링리스트를 한참 뒤져본 결과 귀도의 적극적인
의도로 막아놓은 것인데, 귀도의 설명에 따르면
빌트인 타입 오브젝트들은 여러 쓰레드에 걸친 것 같은
공유되는 컨텍스트에서 같이 사용되는 경우가 많기 때문에
문제를 발생시킬 소지가 높은 핵이라서 이런 걸 공식적으로
허용해 줄 수가 없다고 하네요.
뭔가 수긍이 가는 것 같기도 하면서도.. 파이썬의 다른 면들은
과연 그렇게 깨끗했나 의심이.. 흐흐흐.. -O- 하여간 약간
아쉽군요~