Python 2.5

Tags:

http://docs.python.org/dev/whatsnew/whatsnew25.html

파이썬 2.5가 나왔습니다. 번호는 링크의 문서와 1대 1 대응되는 것이 아닙니다. 제 임의로 붙였습니다.

1. Conditional Expression

x = true_value if condition else false_value

아 이건 좀; 튀어야 산다인건가요.

contents = ((doc + '\n') if doc else '')

doc가 비어있지 않다면 doc + ‘\n’ 을 쓰고, 비었으면 empty string을 쓰라는 문장입니다. 이상해요; 참과 거짓이 갈리고 분명하게 일반적인 상황에 대한 약간의 예외적인 상황을 처리하는 기법으로 이해는 하겠는데, 그게 중요한게 아니라.. 어떤 조건이 참인가는 거짓인가와 동일한 중요성을 가지는 것이죠. 그래서 참이든 거짓이든 둘다 하나같이 중요한것이고. 그래서 일반적인 것만 돋보이게 한다는 아이디어의 핵심에는 동의하기 힘드네요.

2. Partial Function

import functools

def log (message, subsystem):
    "Write the contents of 'message' to the specified subsystem."
    print '%s: %s' % (subsystem, message)
    ...

server_log = functools.partial(log, subsystem='server')
server_log('Unable to open socket')

OOP보다는 function에 디폴트 값을 런타임에 주면서 function가지고 다 해치워보자같은 접근. 간편화된 dependency injection 비슷한 것 같아보입니다.

3. Relative, Absolute Path Import
경로를 절대/상대로 지정해서 import.

4. catch와 finally를 같이 쓸 수 있음

try:
    block-1 ...
except Exception1:
    handler-1 ...
except Exception2:
    handler-2 ...
else:
    else-block
finally:
    final-block

안된다는게 이상한 것. 예전에 이렇게 같이 쓰는게 안되서 거의 미치려고 했던 것이 생각나는군요.

5. Generator Improvements

def counter (maximum):
    i = 0
    while i < maximum:
        val = (yield i)
        # If value provided, change counter
        if val is not None:
            i = val
        else:
            i += 1
&#91;/code&#93;

라고 정의하고,

&#91;code lang="python"&#93;
>>> it = counter(10)
>>> print it.next()
0
>>> print it.next()
1
>>> print it.send(8)
8
>>> print it.next()
9
>>> print it.next()
Traceback (most recent call last):
  File ``t.py'', line 15, in ?
    print it.next()
StopIteration

와 같이 사용합니다. 솔직히 파이썬을 별로 안써서 그런건지 잘 안와닿음. 중요한건, yield로 보낸 다음, 받는 쪽에서 다시 그 generator와 상호작용할 수 있다는 것인듯 하네요.

6. with clause

with open('/etc/passwd', 'r') as f:
    for line in f:
        print line
        ... more processing code ...

금방 아실 듯. 파일을 open 해서 f에 넣고 with 블럭 끝나면 닫는다는 것입니다. C#의 using이잖아~라는 생각이 저도 들었어요.

7. Exceptions as New-Style Classes
Old-Style 클래스가 뭔지 모르니 무슨말인지 모르겠군요. hierarchy 바꿨단 말은 알겠는데..

8. Other Language Changes
– dict에 기본값 부여 가능: C++에도 이런기능 있어야합니다 진짜. 가령 map<string, int> m; 가 되어있으면 무조건 m[“i_don_exist”] 를 가져오면 0 가져오잖아요. 이걸 간단하게 default 값을 줄 수 있으면 정말 좋을텐데요.

– quit() 치면 빠져나갈 수 있다: 그냥 quit 쳐도 나가게 하지 꼭 함수 불러야하게하는 것 마음에 안듭니다. 사용자가 나가려고 하는거 뻔히 알면서 ‘CTRL+D 누르세요’ 라고 문자열 출력하는 이유가 뭡니까. 진짜 이것때문에 성질 나빠지고 있습니다. 파이썬에서 제일제일제일제일제일제일 싫어하는 부분입니다. 그래서 약간 손봐서 quit 쳐도 나가게 고쳐서 썼었는데, 아무튼 짜증입니다.

음 대충 이정도로 저는 정리를…. 태국 쿠테타의 비폭력적이고 원만하며 민주적인 해결이 있기를 기원하며.

Comments

3 responses to “Python 2.5”

  1. 공성식 Avatar
    공성식

    –어떤 조건이 참인가는 거짓인가와 동일한 중요성을 가지는 것이죠. 그래서 참이든 거짓이든 둘다 하나같이 중요한것이고. 그래서 일반적인 것만 돋보이게 한다는 아이디어의 핵심에는 동의하기 힘드네요.

    저도 민구님 의견과 같습니다.
    파이썬이 점점 opinionated language로 가는 것 같습니다.

    일반적인 코딩 가이드에 보면 동일한 비중을 가진 경우엔 if…else… 를 사용하고 예외적인 경우를 체크하기 위해서는 if…else… 대신 guard clause를 사용하라고 하는데 파이썬은 좀 다른 방향으로 나가고 있네요.

    근데 Guido가 구글에서 일하기 시작하면서 Java의 영향을 받고 있다는 사실은 참 재밌네요.

  2. 이원구 Avatar

    map에 default값을 주기 위한 방법으로 간단한 type wrapper 클래스를 만들어서 쓰면 될 것 같습니다.

    template <class T, T N>
    class init_value_type
    {
    public:
    init_value_type(T n = N) : n_(n) {} // no explicit
    operator T() {
    return n_;
    }
    private:
    T n_;
    };

    typedef init_value_type<int, 3> int_3;

    map<string, int_3> si;

    cout

  3. 이원구 Avatar

    켁. 방심하다가 마지막 cout에서 escape를 하지 않았군요. :-)

    cout << si[“no_exist”] << endl;

    입니다.

Leave a Reply

Your email address will not be published. Required fields are marked *