파이썬(Python) 2.5에서 새로운 점

이 글에서는 파이썬 2.5에서 달라진 점들을 기술할 것이다. 원래는 파이썬 문서에 있는 What's New In Python 2.5를 전부 번역하려고 했으나, 중간에 조건식까지 번역하다가 이거는 전혀 불필요한 짓이라고 생각이 되어 실제로 중요한 것들만 적기로 했다.

참고한 문서: http://docs.python.org/py3k/whatsnew/2.5.html
원저자: A.M. Kuchling

1. PEP 308 : 조건식(Conditional Expressions)

C 언어에서는 삼항연산자라고 해서 if 문을 한줄로 쓸 수 있는 방법을 제공한다. 그러나 파이썬에서는 이러한 방법이 없는데, 예전부터 이러한 문법의 요구가 있었다고 한다. 그래서 2.5에서는 조건식 문을 새로 등장 시켰는데 문법은 아래와 같다.
x = true_value if condition else false_value


2. PEP309 : Partial Function Application

파이썬 2.5에서 새로운 모듈이 추가 되었는데, functools 라는 모듈이다. 이 모듈은 함수 스타일의 프로그래밍을 위한 툴들을 포함하고 있다.

먼저, 이 모듈에 partial() 함수는 같은 기능을 갖는 함수를 만드는 것인데, 일부의 인수가 이미 채워진 함수를 만들고자 할 때 쓰는 것이다. 예를 들면 f(a, b, c) 가 있는데, g 라는 함수를 새로 만들려고 한다. 그런데 g는 f와 같은 기능을 하지만 a 에 이미 인수 1이 채워진 상태로 작동시키려고 한다.

이럴 때 g = functools.partial(f, 1) 을 해주게 되면 g(b, c)는 f(1, b, c)로 작동을 하게 된다.

다음으로, 장식자들을 더 잘 작동하게끔 만들어주는 함수들이 추가 되었는데, update_wrapper() 와 wraps() 이다.

장식자를 사용하면 traceback 에 실제 작동하는 함수들이 정확하게 표현되지 않는다. 이러한 것을 보정하는 것이 이 함수들이 기능이다. 그리고 wraps() 는 함수라기 보다는 장식자이다.
(내가 이들의 기능을 공부하면서 본적이 있는데, 어디서 봤는지 모르겠다. 기억상으로는 장식자를 썼을 때 문서 문자열이나 함수의 이름이 제대로 나오지 않았던거 같은데, 이에 대한 오류로 wrapper 를 쓰라고 했던 것 같다.)


3. PEP 314 : Metadate for Python Software Packages v1.1

파이썬 패키지와 관련된 내용인데, 아직 패키지와 관련해서는 잘 모른다. 자세한 내용은 직접 참고.


4. PEP 328 : Absolute and Relative Imports

이 내용은 임포트할 때 절대적 경로와 상대적 경로에 관한 부분이다. 어떤 모듈들이 패키지를 구성할 때 같은 이름이 있을 경우 어떤 것을 요구하는지를 명확히 하기 위해 도입되었다.

예를 들어 pkg 내에 main.py 와 string.py 가 있다고 하자. 이때 main.py 에서 파이썬 표준 모듈인 string 을 임포트하려면 어떻게 해야 할까?

일반적으로 import string 을 하게 되면 pkg 내의 string.py 가 임포트가 된다. 그러나 표준 모듈을 임포트 하려면 그 표준 모듈의 경로를 찾아서 임포트 해야 할것이다. 그러나 이러한 구조가 모든 곳에서 동일 하지 않을 수 있기 때문에 코드에 문제가 있다.

이것을 해결하기 위해 절대적, 상대적 임포트가 추가 되었다. 일단 절대적 임포트(absoult import)는 import (module) 을 하게 되면 항상 표준 module 을 임포트하게 된다.
(단, 2.5에서 절대적 임포트는 from __future__ import absolute_import 를 통해서 가능하다. 이게 기본이 되는 버전은 2.7일 것이라고 적혀있다.)

상대적 임포트(relative import)는 폴더 경로에서 점을 찍는 방식과 동일한 방법을 사용한다. 위의 예에서 string.py 를 임포트 하려면 from pkg import string 을 해도 되고, from . import string 을 해도 된다.(main.py 내에서)

그리고 string.py 내의 이름을 가져오려면 from .string import name1, name2 와 같이 사용하면 된다.

또, from .. import A 를 하면 현재 임포트하는 모듈의 하위 폴더에서 A.py 를 찾아 임포트하게 된다.


5. PEP 338 : Executing Modules as Scripts

음... 잘 모르는 내용이다. 패스(ㅡㅡ;)


6. PEP 341 : Unified try/except/finally

try, except, finally 구문을 통합해서 쓸 수 있게 되었다. 예전까지는 try, except 따로 try, finally 따로 써야 했었다. 그러나 2.5에서는 통합해서 쓸 수 있도록 변경 되었다.


7. PEP 342 : New Generator Features

발생자가 문(statement)에서 식(expression)으로 변경 되었다. 원래 발생자에는 리턴값이 없었으나 발생자를 식으로 바꾸면서 리턴값이 있도록 되었다. 발생자가 next() 메소드에 의해 규칙적으로 호출 되면 리턴값은 None 이지만, send() 메소드에 의해 호출 되면 send에 의해 받은 값을 리턴하게 된다.

여기서, 발생자에 send(value) 메소드가 추가 되었다. 이 메소드는 위에서 말한 것처럼 발생자에 값을 돌려준다.

이 외에도 두가지 메소드가 더 추가 되었는데, throw(type, value=None, traceback=None) 과 close() 가 추가 되었다.

전자는 발생자 내에서 예외를 일으키고, 후자는 발생자를 종료시키기 위해 발생자 내에서 GeneratorExit 예외를 일으킨다.


8. PEP 343 : The 'with' statement

파이썬에 with 구문이 추가 되었다. 이 부분은 데이터베이스와 관련된 내용 같은데, 결론을 말하자면 try...finally 구문을 대체하는 것 같다. 구문 사용법은 아래와 같다.
with expression [as variable] :
    with-block
식 부분이 실행되면 이 식은 반드시 context management protocol 을 지원하는 객체를 리턴해야 한다.

그리고 context management protocol 을 지원하는 객체란 __enter()__ 와 __exit__() 메소드를 갖는 객체를 의미한다.

with 구문이 실행 되면 __enter__() 메소드가 실행이 되고, with-block 이 종료된 후(예외를 발생한 후) __exit__() 메소드가 실행되면서 구문이 끝난다. 즉, try...finally 와 같은 방식이라고 보면 될 것 같다.

그리고 with 구문을 파이썬 2.5에서 실행시킬려면 from __future__ import with_statement 를 해야 하고, 2.6에서는 기본이다.

또, with 구문을 위한 모듈이 추가 되었는데, contextlib 라는 모듈이다. 더 자세한 것은 직접 참고.


9. PEP 352 : Exception as New-Style Classes

예외 클래스가 New-Style 클래스로 변경되었다. 그리고 계층 구조 또한 변했다. 예외 클래스가 New-Style 로 변경 되었기에 사용자 예외를 만들기 위해서는 반드시 예외 클래스를 상속해야 된다. 그리고 문자열 예외 처리는 2.5 에서는 비권장 된다.


10. PEP 353 : Using ssize_t as the index type

C 확장과 관련된 부분으로 잘 모른다. ;;; 자세한 내용은 직접 참조.


11. PEP 357 : The '__index__' method

__index__ 메소드가 추가되었는데, 이 메소드는 어떤 객체로든 슬라이싱이 가능하도록 하는 메소드이다.

문서에는 NumPy 개발자들이 슬라이싱에 정수형이 아닌 객체를 사용하고 싶은데, 그럴 수 없었다는 것이다.

__index__ 메소드는 인자를 가지지 않고, 리턴 값은 정수형이어야 한다.


12. Other Language Changes

1) dict 타입에 새로운 메소드인 __missing__(key) 가 추가되었다. 이 메소드는 키를 찾지 못했을 때 호출 된다.

2) 8비트와 유니코드 문자열에 partition(sep)와 rpartition(sep) 메소드가 추가되었다. 문자열을 3개의 값을 갖는 튜플로 분해하는데, 분리자를 기준으로 (왼쪽, 분리자, 오른쪽)으로 분해한다. 다만 partition 은 왼쪽부터이고 rpartition 은 오른쪽부터이다.

3) 문자열 메소드인 startswith 와 endswith 의 확인 인자 부분에 튜플이 지원된다.

4) max(), min() 함수에 key 인자가 추가되었다. 이 인자는 sort()의 key 와 유사한데, 인자에 함수가 주어지면 그 함수에 따라 최대, 최소를 찾는다.

5) 내장함수로 any(), all() 함수가 추가 되었다. 두 함수 모두 인자로 iterator 를 받는데, any 는 iterator의 리턴 값이 하나라도 참이면 참을 리턴한다. all은 모두가 참일 때 참을 리턴한다.

6) __hash__ 메소드의 리턴값이 long integer 와 regular integer 둘다 가능해졌다. 그리고 id() 함수의 리턴 값이 항상 양수로 바뀌었다.

7) 아스키 코드가 기본 인코딩으로 변경되었다.

8) UnicodeWarning 경고가 새로 추가되었다. 유니코드로 바뀔 수 없는 8비트 문자열과 유니코드 문자열을 비교할 때 발생한다. 더 자세한 것은 직접 참조.

9) 패키지의 디렉토리에 __init__.py 가 빠졌을 경우 경고가 발생하도록 ImportWarning 이 추가 되었음.

10) base 클래스의 목록이 비는 것을 허용하도록 되었다. 예를 들어 class A(): 와 같이.


13. Interactive Interpreter Changes

인터프리터에 quit(), exit() 함수가 추가로 생겼다. 이전까지는 quit, exit 를 입력하면 종료하는 방법의 문자열을 보여주었는데, 2.5 부터는 quit, exit 가 호출될 수 있도록 변경되었다.
(참으로 세세한 것까지 초보들을 배려하는 것 같다. 문서 상에도 뉴비를 위한 것이라고 되어 있다.)


14. Optimizations

다양한 최적화가 이루어졌다. 자세한 것은 직접 참조.


15. New, Improved, and Removed Modules

(정말 더 쓰기가 힘들다.) 정말 간단하게 쓰고 필요한 것들만 조금 설명 하겠다. 자세한 것은 직접 참조.

1) audioop, codecs, collections, contextlib, cProfile, pstats, csv, datetime, difflib, doctest, email, fileinput, gc, heapq, itertools, locale, mailbox, msilib, nis, operator, optparse, os, pdb, pickle, cPickle, pkguitl, pyexpat, Queue, regex, regsub, statcache, tzparse, whrandom, dircmp, ni, rlcompleter, socket, spwd, struct, sys, tarfile, threading, unicodedate, uuid, weakref, webbrowser, xmlrpclib, zipfile, zlib

모듈들이 새로 추가되거나 수정되거나 제거되었음(ㅡㅡ;)

2) the ctypes package 추가
3) The ElementTree Package 추가
4) The hashlib package 추가
5) The sqlite3 package 추가
6) The wsgiref package 추가

(쓰고나니 설명이 없다.....)


이 외에도 추가적으로 build 와 C API 에 변화가 있는데, 이 외의 내용들은 직접 참조 바란다.

ps. 중간까지는 쓸만 하다가 기타 부분 쪽 설명 들어가면서부터 정말 쓰기가 힘들었다. 번역 안 한게 다행이라고 생각된다.

댓글 없음:

댓글 쓰기