총 무게 14.5kg..(옆에 있는 토끼군은 빼고~) 가장 많이 든 날은 하루에 5과목;; 아고 학교 어떻게 다니나.. T_T
Month: March 2006
파이썬 2.5 미리보기 1편: with 절
이제 파이썬에 새로운 것이 계속 들어와도 놀라지 않을 만큼, 파이썬은 끊임없이 새로운 문법이 매 버전마다 들어오고 있습니다. 파이썬 2.3에서 generator/bool, 2.4에서 generator expression이 하이라이트였다면, 2.5에서는 단연 PEP-343 with 절이 가장 주요한 문법의 변화가 되겠습니다.
with 절은 이미 다른 언어에 많이 소개가 되어 있는 개념을 구현하기 위한 것인데, ruby의 block이나 자바의 synchronized 같은 것들과 비슷한 개념을 지원합니다. 그렇지만, 비주얼 베이식의 with같이 네임스페이스를 줄이는 목적으로 쓰는 것은 아니기 때문에 서로 다릅니다.
with 절은 원래 PEP-340 Anonymous Block Statements에서 소개되었던 문맥 처리 기능들을 PEP-340이 몇가지 문제로 인해서 거부되자 대체 문법으로 등장한 것입니다. with 절의 문법은 이렇습니다.
1 2 |
with EXPR as VAR: BLOCK |
as VAR 부분은 생략이 가능합니다. 이렇게 쓰면 내부적으로 다음과 같이 번역이 되어서 실행이 되게 됩니다. (소문자로 된 변수들은 VM 내부적인 변수이므로 소스코드에서는 접근 가능하지 않습니다.)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
ctx = (EXPR).__context__() exit = ctx.__exit__ # 아직 호출하지는 않음 value = ctx.__enter__() exc = True try: try: VAR = value # "as VAR"이 있을 경우에만 BLOCK except: # 여기서 예외 처리를 함 exc = False exit(*sys.exc_info()) finally: # 지역적이지 않은 분기는 여기서 처리함 if exc: exit(None, None, None) |
번역 부분을 약간 살펴보면 새로운 메쏘드 이름인 __context__, __exit__, __enter__를 쓰고 있습니다.
with x as y: 라고 쓰면 x.__context__()를 호출한 다음,
그 녀석이 리턴한 객체의 __enter__()를 호출해서 리턴된 것을
y에 넣어줍니다. 단, with절은 블럭 안에서 프레임이 생성되지 않기 때문에
y의 유효영역은 with절 안이 아니라, 외부의 지역 네임스페이스입니다. (밑줄 쫙~)
자.. 과연 이런게 어디에 쓸모가 있을까! 생각해 보면, 당장 생각 나는 것은 임시 파일을 생성했을 때 귀찮게 finally로 감싸서 파일 지워주는 경우가 생각납니다. 그런데, 이런 사용 사례들을 일일이 위와 같이 __context__, __enter__같은 것을 다 구현해 주기는 굉장히 귀찮기 때문에, 실제로는 제너레이터로 간단하게 구현할 수 있도록 contextlib이라는 모듈이 신설되었습니다. contextlib에는 contextmanager라는 데코레이터가 있어서, 제너레이터를 구현할 때 @contextmanager를 통과시켜 주면 쉽게 with용 컨텍스트매니저로 변신을 시켜 줍니다. closing이라는 것도 있어서 with를 벗어나면 자동으로 파일 닫게도 할 수도 있고요~
한 번 시험해 보기 위해서, 대표적인 with절 예상 사용 사례인 SQL 데이터베이스의 트랜잭션 처리 부분을 한번 해 봤습니다. 🙂
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
from __future__ import with_statement from contextlib import contextmanager import MySQLdb @contextmanager def mysqlconn(hostname, username, password, database): conn = MySQLdb.connect(hostname, username, password, database) curs = conn.cursor() try: curs.execute('BEGIN') yield curs except: curs.execute('ROLLBACK') raise else: curs.execute('COMMIT') finally: conn.close() with mysqlconn('localhost', 'user', 'passwd', 'db') as curs: curs.execute('select count(*) from schedule') print curs.fetchone() |
with절에 진입하면서 자동으로 데이터베이스 접속을 맺어주며, 안에서 예외가 발생하면 롤백하고, 예외가 발생하지 않고 빠져나오면 자동으로 커밋하게 해 줍니다. 이와 비슷하게 threading.Queue같이 쓰레드 간 동기화나 임시 객체가 생성되는 온갖 사용처에 아주 유용하게 쓰일 수 있을 듯 합니다~ (위 예제를 유심히 보시면 with절 외에도 2.4에서는 안 되던 문법이 2가지 숨겨져 있습니다. 이히히히~)
그런데, with는 새로운 키워드이기 때문에, 2.5에서는 from __future__ import with_statement를 해야지만 사용할 수 있고, 2.6부터는 정규 키워드로 지정될 예정입니다.
자, 이제 파이썬이 프로그래밍을 안 해본 사람도 하루만에 배울 수 있는 언어라는 굴레에서 해방되었습니다. -O-;;;;;
《대체 뭐가 문제야?》
제럴드 와인버그의 또 다른 유명한 책 《대체 뭐가 문제야? Are Your Lights on?》가 번역되어 나왔습니다. 먼저 번역서가 나온 《컨설팅의 비밀》도 무척 재미있게 읽었기에, 이 책도 다른 책 읽던 도중에 참지 못하고 덥썩 읽어버렸습니다. (지금 사 놓고 안 읽고 쌓아둔 책이 5권 =.=;)
이번 책은 문제를 해결하는 전문 컨설턴트가 아니더라도, 인생에서 문제가 한 번이라도 있었던 사람들이라면 언제나 그 문제를 해결할 때 도움이 될 만한 내용을 다루고 있습니다. 아침 먹다가 밥풀 흘리는 사소한 문제부터 시작해서, 버스에서 출근할 때 자리에 못 앉아서 피곤하게 서있다가 낮에 존다던지, 한 번 죽을 때 마다 수천만원의 손실이 발생하는 프로그램이 왜 죽는지 모를 때 문제를 “다루는” 방법에 대해서 시야를 넓혀줍니다.
SI 프로젝트를 하다가 꼬일 때, 대체로 보면 문제가 뭔지 제대로 파악을 못한 경우가 많습니다. 저도 2004년에 했던 K모사 프로젝트를 되돌이켜 보면, 처음 1달간, 발주사의 구체적인 문제가 무엇인지, 무엇이 필요한지, 해결 방법이 어떤 영향을 주는지를 파악하지 않고, 나름대로의 상상을 곁들여서 마구 커다란 스펙을 잡아놓고 진행하다보니 결국에는 기능은 엄청나게 많고 발주사는 그래도 기능이 모자란다고 화를 내는 지경에 이르렀던 적이 있습니다. 프로젝트를 다 끝내고 나서 되돌이켜 보면 그 사람들이 필요했던 것은 우리가 만든 기능의 극히 일부분에 지나지 않는데, 문제가 뭔지도 모르고 나름대로의 가정을 덧붙인데다가, 문제를 제시한 사람들이 말하는 해결방법을 곧이 곧대로 다 듣다보니 일이 커질 뿐만 아니라 문제 해결도 어려워지게 되었던 정말 살아가는데 이렇게 하면 안 되는구나 하는 온갖 교훈을 다 얻은 프로젝트였지요. -.-;;
이 책에서는 문제 해결의 가능성을 넓히기 위해서, 누구의 문제인가?, 무엇이 문제인가?, 문제의 핵심은 무엇인가? 같은 기초적인 것을 찾는 방법을 왕공룡씨 엘리베이터을 사례로 들고 있습니다. 한 건물의 엘리베이터 트래픽 문제가 주지사나 법의 문제까지도 생각해 볼만한 가치가 있다는 점이나 엘리베이터 주위에 낙서할 수 있는 크레용을 놓는 것으로도 해결이 가능하다는 것 같이 문제 자체에 더 집중하면 얻을 수 있는 손 쉬운 해결 방법을 찾는 것을 보여주고 있습니다.
책이 굉장히 짧기 때문에, 내용을 더 소개하다보면 스포일러가 돼 버릴 것 같아서, 내용 소개는 여기서 줄이고, 인상적이었던 부분 몇 개 인용해 봅니다. 🙂
유머 감각이 없는 사람의 문제를 해결하려고 노력하지 마라.
– 책 44페이지
(13명의 학생 중 1명이 교실에서 자꾸 담배를 피울 때 학생들이 토론해서 해결하려고 하는 이야기 중에서)
만약 앞서의 답이 3이었다면, 즉 ‘교수’의 문제였다면 그 결과가 어떠했을까 생각해 보자. 아마 다음과 같이 하지 않았을까?
- ‘담배를 피울 수 없도록’ 규정을 만들고 흡연 학생이 수업을 그만 두도록 해서 그가 분개하도록 만든다.
- 담배를 피우도록 규정을 만들어서 담배를 못 피우는 일부 학생들이 수업을 그만두도록 하거나 혹은 담배 연기의 영향으로 점심조차 못 먹게 만든다.
- 흡연 강의와 금연 강의로 나누어서 날짜나 시간을 분리하여 모든 사람을 불만족스럽게 만든다.
그러나 이처럼 무언가를 규정으로 만드는 대신 교수는 그 자신만의 문제해결 교훈을 따랐다.
그들 스스로 문제를 완벽하게 풀 수 있을 때에는 그들의 문제 해결에 끼어들지 않는다.
– 책 111페이지
학교에서 제대로 된 문제 해결사들을 배출하지 못하는 이유는 아마도 학생들에게 무엇이 문제인지 찾을 수 있는 기회를 주지 않았기 때문알 것이다. 학교에서는 선생님들이 문제라고 ‘말하는’ 것이 그냥 문제인 것이다.
– 책 164페이지
오랜만에 디자인 교체
개강을 기념해서 그동안의 단아한 디자인에서 좀 변화를 줘서
어둠컴컴하고 습한 디자인으로 바꿔 봤습니다. -ㅇ-
제목을 붙이자면…. “해그리드의 주방” 쯤..? (별 생각 없이 -ㅇ-)
요새 유행하는 스타일로 본문만 흰 바탕에 나오게 했구요~
전반적인 글꼴 크기를 약간씩 키웠습니다. 그래서 스크롤을
안 하고서는 한 화면에서 볼 수 있는 것이 별로 없군요! 하하하..
제가 요새 눈이 침침해서 큰 글씨가 좋아져서 –;;;;;
작업 도중에 css 문제 해결에 도움을 주신 소타님과 klutzy님 감사합니다~
쓰시는 브라우저에서 이상하게 보이는 부분이 있으면 알려주세요~