itemgetter와 attrgetter

Guido가 몇 년째 열심히 반대하다가 얼마전에 드디어 들어간 list.sorted와 얼마전 블로그에서 얘기했던 itertools.groupby에서 아주 유용한 itemgetter와 attrgetter가 얼마전에 추가됐습니다. 원래 lambda로 처리해야하는 건데 아무래도 lambda만 들어가면 일단 거부감이 들기 때매.. 흐흐…

예를 들면 원래 [(10, “merong”), (20, “hoho”), (30, “abcd”)]를 순서대로 정렬하려면

이렇게 됐는데, 파이썬 2.4에서는 이렇게 처리하면 됩니다. (미리 from operator import itemgetter 한 상태)

므흐흐.. 좋기는 한데, 뭔가 itemgetter랑 attrgetter는 너무 한군데만 특수화되었다는 느낌을 지울 수 없는데, 다시 메일링 리스트에 Michael W. Hudson이 엄청난 팁을 하나 공개했는데, 요렇게 쓴다고 합니다. (정확히는 이 코드는 Thomas Heller가 mwh의 사용법을 보고 추리해서 짠 것..)

즉, X + 1 하면 + 1하는 순간에 Adder인스턴스가 생성돼서, +1하는 객체로 둔갑을 해서 결국 웬만한 것은 lambda 없이도 쓸 수 있게 된다는.. 크크 정말 멋지네요 +_+. 그런데, 이 방법에서는 X.split(‘.’) 같이 아래 어트리뷰트를 호출하는 건 코드가 실행되는 때가 먼저 와 버리기 때문에 제대로 동작하지 못하게 되는데, 몇가지 껍데기를 씌우면 되기는 되겠네요..

음.. 하여간 대부분의 경우에 정말 멋지게 동작해서 mwh의 이 아이디어는 아주 멋져보입니다.~ :)

(덧붙임: 나중에 리스트에 다른 사람이 이걸 파이썬으로 구현한 소스를 올려놨네요. http://www.sil-tec.gr/~tzot/predicates.py 에서 받을 수 있습니다.)

CJKCodecs 1.0.2, iconvcodec 1.1.2 릴리즈

일본어 호환성 지원을 대폭 강화한 CJKCodecs 1.0.2와 기본적인 버그 몇가지를 수정한 iconvcodec 1.1.2를 릴리즈했습니다.

변동사항은:

  • str.encode에서 그냥 스트링 자체를 메모리에 있는 그대로 유니코드 인코딩을 해버리는 모호성 문제를 고쳤습니다. 이제 기본 인코딩으로 디코드한 다음에 인코드합니다.

  • euc-jp-strict와 shift-jis-strict 코덱이 추가되었습니다. -strict 코덱들은 거의 완벽하게 표준을 지원하는 쪽으로 갈 예정입니다.

  • shift-jis 코덱이 이제 JapaneseCodecs 와 호환됩니다. (비표준 매핑 허용)

    • U+005C REVERSE SOLIDUS 를 SHIFT-JIS 0x5c 로 매핑

    • U+007E TILDE 를 SHIFT-JIS 0x7e 로 매핑

    • U+FF3C FULL-WIDTH REVERSE SOLIDUS 를 SHIFT-JIS 815f로 매핑

  • euc-jp 코덱이 이제 JapaneseCodecs 와 호환됩니다. (비표준 매핑 허용)

    • U+00A5 YEN SIGN 을 EUC-JP 0x5c 로 매핑. (단방향)

    • U+203E OVERLINE 을 EUC-JP 0x7e 로 매핑. (단방향)

  • ChineseCodecs JapaneseCodecs 와 호환성을 위해 인코딩 별명이 추가됐습니다.

    • ISO-2022-JP-1: ISO-2022-JP-EXT

    • BIG5: BIG5-TW

    • GB2312: EUCGB2312-CN

입니다. FreeBSD 포트는 지금 프리즈 중이라 업데이트하지 못했습니다. 이번엔 현실적 일본어 지원이 많이 개선되었으니 혹시 ninix나 orangeslice쓰시는 분들은 shift-jis 이걸로 잘 되나 테스트해주세용.. (저는 일본어를 몰라서 –;)

다운로드는 http://cjkpython.i18n.org/ 에서~ :)

SeeAlso http://mail.python.org/pipermail/i18n-sig/2003-November/001623.html

itertools.groupby

저는 파이썬 2.3에서 추가된 모듈 중에 개인적으로 가장 좋아하는 모듈을 꼽으라면 단연 [WWW]itertools 모듈을 꼽겠습니다. itertools 모듈은 C나 Pascal같은 고급 언어들이나 기타 스크립트 언어들 대부분에서 마저도 지저분하게 처리가 되는 for/while/do-while 등의 루프 패턴들을 정말 간단하게 정리해 주는 데 엄청난 효용을 자랑하는데, 예를 들어 파일에서 START로 시작하는 라인부터 읽고 싶다면 옛날 구현에서는 보통:

그런데 이제, itertools를 쓰면

으흐흐흐.. 그 외에 여러개의 이터레이트 가능한 객체들을 연결해서 한꺼번에 처리해주는 chain이나 여러번 재활용하게 해주는 cycle, 일정회수 반복하게 해주는 repeat등 유용한 것이 정말 많습니다. +_+

그런데, 엊그제 귀도가 샤워 중에 groupby라는 새로운 이터레이터 패턴을 만들었는데 요것도 정말 쓸모가 많은 듯 해서 한번 대장금 보면서(;;;) 구현해 보았습니다. (패치는 [WWW]여기) groupby는 모인모인의 TitleIndex 같은 페이지에서 정말 지겹게도 쓰이는, 인덱스별 분류 패턴을 간소화를 시켜주는데, 보통 이런 짓을 하려면 이렇게 구현하겠죠.. 문자열이 가득 든 소팅된 x 리스트를 첫자를 기준으로 줄을 그으려면

구현이야 되지만, 뭘 하려는지 코드만 대충 봐서는 한눈에 들어오지도 않습니다. 흐흐.. 근데 요걸 새로운 groupby 이터레이터를 쓰면 간단하게 되는군요! 꺄아

뭐하는지도 눈에 보이고 구현도 간단하고.. 정말 좋네요.. +_+

한글 글자들을 초성 기준으로 분류하는 것도 이렇게 간단하게 됩니다. :)

요렇게 하면 결과는

귀도도 말했듯, 이터레이터와 제너레이터 장난은 정말 코드 간소화에는 엄청난 도움을 주는 듯 합니다. 앞으로도 재미있는 이터레이터가 2.4에 많이 추가되길.. :)

CJKCodecs 1.0.2 예정

CJKCodecs에 그동안 오랫동안 있었던 일본어 호환성 문제가 대충 잡힘에 따라, 다음 주 중으로 1.0.2를 릴리즈하려고 합니다. 혹시 CJKCodecs에서 아주 사소한 문제점이라도 발견하신 것이 있으면 릴리즈 전에 꼭 알려주세요.. :) 이번주 토요일이나 일요일 쯤에 내놓으려고 합니다. 1.0.2가 아무래도 1.0 브랜치에서는 마지막이 될 듯 합니다.

현재까지 예정된 1.0.2에서의 수정 사항은:

  • str.encode에서 메모리에서 바로 인코드해 버리는 문제 수정

  • shift-jis 코덱에서 ‘~’ (틸드)가 인코딩/디코딩이 안 되는 호환성 문제 수정 (사실 원래 법대로 하자면 틸드는 JIS X 0201에는 없기 때문에 안 되는게 맞지만, JapaneseCodecs에서는 0x80이하를 그냥 아스키 영역에 매핑하고 있기 때문에 호환성 때문에..)

  • shift-jis 코덱에서 U+FF3C (FULL-WIDTH REVERSE SOLIDUS)를 매핑하지 않는 문제 수정.

  • ISO-2022-JP-EXT 코덱 추가

강태욱님의 cp933 코덱은 아직 문제점이 해결되지 않은 듯 해서, 아무래도 1.1 브랜치로 넘겨야 할 것 같네요.. :)

PEP289: Generator Expressions

PEP [PEP]289 제너레이터 익스프레션은 2002년 1월에 처음 제안되어 얼마전에 파이썬 2.4에 채용하기로 결정된 문법입니다. 파이썬 2.0에서 도입된 리스트 컴프리헨션의 제너레이터 버전이라고 볼 수 있는데, 리스트 컴프리헨션이 전체 리스트를 일일이 다 만들어서 넘겨주기 때문에, 한꺼번에 실행되는터라 부하도 크고 메모리도 무진장 먹습니다. 요 문제를 해결하기 위해 제너레이터로 만들어주는 건데.. lambda와 list comprehension의 중간쯤 된다고 볼 수 있겠군요.. 흐흐.. 예를 들면, 리스트 컴프리헨션에서는 요렇게

sum([x*x for x in range(10000)]) 

10000개 원소의 리스트를 한꺼번에 다 계산해서 더하게 되는데, 제너레이터 익스프레션에서는

sum(x*x for x in range(10000)) 

이렇게 하면, 이게 제너레이터로 변신해서 sum함수에서 1개씩 이터레이션 할 때마다 실행되게 됩니다. 흐흐 만세~

그런데, 이 문법은 아무래도 모호성 문제가 있는데

이런식으로 뭐 결과적으로는 맞긴 한데.. 뭐 하여간 모호하긴 하군요.. 흐흐

자 그럼 제너레이터 익스프레션을 본격적으로 맛볼 시간!

하하 대단 -.,-;;

흐흐.. 그런데, 아직 PEP[PEP]289 는 구현이 안 나와있어서 시험해 볼 수는 없는데 Jeff Epler가 yield가 앞에 들어가는 옛날 형식 문법으로 구현한 compiler 패키지 기반으로 된 것만 나왔습니다. 그래서 진짜 파이썬에서 쓰는 parser 모듈로 구현을 한 번 해보려고 하고 있는데 문법이 야릇하다보니 문법 구현부터가 힘들군요 –; 일단 패치는 다음과 같이 만들어 봤는데.. arglist가 아무래도 test 토큰이 앞에 argument가 *로 붙은거랑 겹치다보니.. ambiguity가 자꾸 발생하는군요.. 이것 어떻게 해결해야할 지 –;;; -ㅇ-; BNF 잘 아시는 분께서는 좋은 의견이 있으시면 알려주세요~♡;;

Python 2.3 이상 치명적인 gc/weakref 버그 발견

Python 2.3에 weakref와 gc에 관련된 치명적인 버그가 발견되어 방금 고쳐졌습니다. 발생하는 경우는 이렇게 그냥 간단한 코드에서도 볼 수 있습니다.

I -> I.wr -> I.acallback -(strong ref) -> I 이런 식으로 J와 II사이에 사이클릭 레퍼런스가 일어나는 데 중간에 몇개가 weakref로 되어있지만, 파이썬 2.3에서 완전히 도입된 new style class의 gc에서 weakref를 전혀 처리를 하지 않고 있어서 죽어버린다는군요.

[FreshPorts]lang/python 포트에는 이 패치를 넣기 위해서 portmgr에게 허락을 요청해 놓았습니다. (어제부터 프리즈 -.-;;) 그리고, [WWW]Tim Peters는 메일에서 올해 안에 2.3.3 릴리즈를 하자고 하고 있네요. 파이썬 개발자들은 세그폴트 정도는 신경 안 쓰는 줄 알았더니 -ㅁ-;;;

Python 2.4에서 deprecate되는 내장 함수들

apply(), coerce(), intern() 내장 함수 셋이 압도적인 지지로 deprecate결정되고 있습니다. apply의 경우에는 이미 deprecation상태인데, 셋 다 그래도 내장함수이기 때문에 다음 릴리즈에서는 조용한 warning, 그 다음엔 시끄러운 warning, 그 다음엔 진짜 삭제 정도의 과정으로 지워질 듯한 전망입니다.

(믓흥~)

파이썬 2.3.2 파이널 릴리즈

2.3.1에서 발견된 문제점들을 수정한 2.3.2가 릴리즈되었습니다. 2.3.1에서 있었던 주요 문제점은

  • os.fsync가 오타로 인해 빠짐

  • 소스 타볼에 CVS/ 디렉토리가 그대로 다 남음

  • OpenSSL 보안 버그 수정된 바이너리로 내장 (윈도우 배포본)

  • 문서 밑에 2.4.0a0이라고 나온 것 버전 제대로 수정

  • HP/UX에서 configure 제대로 되지 않던 문제 수정. (이 문제는 사실 HP/UX에서는 허구헌날 발생하는 거라서, 제대로 된다는 게 이상할 정도이긴 합니다. :) )

그리고, 다음 릴리즈인 2.3.3은 3달내에 다시 릴리즈할 예정이라고 합니다. FreeBSD포트는 지금 대구에 있는 관계로 조만간 업데이트할 예정입니다~

CJKCodecs 1.0.1 릴리즈

얼마전에 강태욱님께서 알려주신 빈 문자열을 str.decode 메소드를 이용해서 디코딩할 때 에러가 나는 문제를 수정한 CJKCodecs 1.0.1을 릴리즈했습니다. 그 외에, ISO-2022-JP-2 코덱이 G2에 할당되는 ISO-8859-1(서유럽알파벳), ISO-8859-7(그리스알파벳)을 처리하지 못하던 문제도 수정하였습니다.

아마 이번 버그 픽스로 ninix-aya나 orange-slice에서 발생했던 문제가 모두 해결되지 않을까 생각됩니다.

한국 ISP들은 로컬 캐쉬가 징하게 길기때문에 한국에서는 업데이트된 홈페이지를 보시는데 며칠 걸릴 수도 있습니다. (-.-;;)

CJKPython 2.3.1-RC

CJKPython 2.3.1-RC를 [WWW]BerliOS에 올렸습니다. 많이들 테스트해 주시고, 문제점이 있으면 얼른 알려주세요 이히히.. 별 문제 없으면 3~4일 뒤에 RC를 떼고 2.3.1로 릴리즈할 계획입니다.

(강태욱님께서 알려주신 빈 문자열 디코딩 버그는 릴리즈 막 하자 마자 읽는 바람에 2.3.1 정식판에서 고치려고 합니다~;;)

다운로드: http://download.berlios.de/cjkpython/CJKPython2.3.1-RC.exe