Python

Python 2.6의 새로운 기능

저자:

A.M. Kuchling (amk@amk.ca)

이 기사에서는 2008년 10월 1일에 출시된 Python 2.6의 새로운 기능에 대해 설명합니다. 출시 일정은 PEP 361 에 기술되어 있습니다.

Python 2.6의 주요 테마는 언어의 대대적인 재설계인 Python 3.0으로의 전환 경로를 준비하는 것입니다. 가능한 경우, Python 2.6은 기존 기능이나 구문을 제거하지 않음으로써 기존 코드와의 호환성을 유지하면서 3.0의 새로운 기능과 구문을 통합합니다. 그렇게 할 수 없는 경우에는, Python 2.6이 할 수 있는 조치를 취하며, future_builtins 모듈에 호환성 함수를 추가하고 -3 스위치를 통해 3.0에서 지원되지 않게 될 사용 사례에 대해 경고합니다.

multiprocessingjson 모듈과 같이 몇몇 중요한 새 패키지들이 표준 라이브러리에 추가되었으나, 어떤 식으로든 Python 3.0과 관련이 없는 새로운 기능은 많지 않습니다.

Python 2.6은 소스 전반에 걸쳐 수많은 개선 사항과 버그 수정이 이루어졌습니다. 변경 로그를 살펴보면 Python 2.5와 2.6 사이에서 259개의 패치가 적용되었고 612개의 버그가 수정된 것을 확인할 수 있습니다. 두 수치 모두 실제보다 적게 산정되었을 가능성이 높습니다.

이 기사는 새로운 기능에 대한 완전한 사양을 제공하는 대신 편리한 개요를 제공합니다. 자세한 내용을 확인하려면 Python 2.6의 문서를 참조하십시오. 설계 및 구현의 근거를 이해하려면 특정 새 기능에 관한 PEP를 참조하십시오. 가능한 경우, “What’s New in Python”은 각 변경 사항에 대한 버그/패치 항목으로 연결됩니다.

Python 3.0

Python 버전 2.6과 3.0의 개발 주기는 동기화되었으며, 두 버전 모두 동일한 날짜에 알파 및 베타 릴리스가 진행되었습니다. 3.0의 개발은 2.6의 많은 기능에 영향을 미쳤습니다.

Python 3.0은 2.x 시리즈와의 호환성을 깨는 광범위한 Python 재설계입니다. 이는 기존 파이썬 코드가 Python 3.0에서 실행되기 위해 일부 변환이 필요함을 의미합니다. 하지만 3.0의 모든 변경 사항이 호환성을 깨는 것은 아닙니다. 새로운 기능이 기존 코드를 망가뜨리지 않는 경우, 해당 기능들은 2.6으로 백포트되었으며 이 문서 내 적절한 위치에 설명되어 있습니다. 3.0에서 파생된 일부 기능은 다음과 같습니다.

  • 객체를 복소수로 변환하는 __complex__() 메서드.

  • 예외를 포착하기 위한 대체 구문: except TypeError as exc.

  • 내장된 reduce() 함수에 대한 별칭으로서 functools.reduce() 추가.

Python 3.0은 여러 새로운 내장 함수를 추가하고 일부 기존 내장 함수의 의미론(semantics)을 변경합니다. bin() 과 같이 3.0에서 새로 도입된 함수들은 Python 2.6에 그대로 추가되었으나, 기존 내장 함수들은 변경되지 않았습니다. 대신 future_builtins 모듈에 새로운 3.0 의미론이 적용된 버전들이 포함되어 있습니다. 3.0과 호환되도록 작성된 코드는 필요에 따라 from future_builtins import hex, map 을 수행할 수 있습니다.

새로운 명령줄 스위치인 -3 는 Python 3.0에서 제거될 기능에 대한 경고를 활성화합니다. 이 스위치를 사용하여 코드를 실행하면 코드를 3.0으로 포팅하는 데 얼마나 많은 작업이 필요한지 확인할 수 있습니다. 이 스위치의 값은 파이썬 코드에서 불리언 변수 sys.py3kwarning 으로, C 확장 코드에서는 Py_Py3kWarningFlag 로 사용 가능합니다.

더 보기

Python 3.0을 위한 제안들을 포함하는 3*xxx* 시리즈의 PEP입니다. PEP 3000 은 Python 3.0의 개발 프로세스를 기술합니다. Python 3.0의 일반적인 목표를 설명하는 PEP 3100 부터 시작하여, 특정 기능을 제안하는 더 높은 번호의 PEP들을 살펴보십시오.

개발 프로세스의 변화

2.6이 개발되는 동안 파이썬 개발 프로세스는 두 가지 중요한 변화를 겪었습니다. SourceForge의 이슈 추적기에서 맞춤형 Roundup 설치로 전환했으며, 문서가 LaTeX에서 reStructuredText로 변환되었습니다.

새로운 이슈 추적기: Roundup

오랫동안 파이썬 개발자들은 SourceForge의 버그 추적기에 점점 더 불만을 느껴왔습니다. SourceForge에서 제공하는 솔루션은 커스터마이즈가 거의 불가능하며, 예를 들어 이슈의 수명 주기(life cycle)를 조정할 수 없었습니다.

이에 따라 Python Software Foundation의 인프라 위원회는 이슈 추적기를 위한 공고를 게시하여, 자원봉사자들이 다른 제품을 설정하고 SourceForge에서 일부 버그와 패치를 가져오도록 요청했습니다. 네 가지 서로 다른 추적기가 검토되었습니다: Jira, Launchpad, Roundup, 그리고 Trac. 위원회는 결국 Jira와 Roundup을 두 후보로 결정했습니다. Jira는 자유 소프트웨어 프로젝트에 비용 없는 호스팅 인스턴스를 제공하는 상용 제품이며, Roundup은 관리할 자원봉사자와 호스트할 서버가 필요한 오픈 소스 프로젝트입니다.

자원봉사자 모집 공고를 올린 후, https://bugs.python.org에 새로운 Roundup 설치가 완료되었습니다. 하나의 Roundup 설치로 여러 추적기를 호스트할 수 있으며, 이 서버는 이제 Jython과 Python 웹 사이트를 위한 이슈 추적기도 호스팅합니다. 앞으로 다른 용도로도 활용될 것입니다. 가능한 경우, 이번 “What’s New in Python”의 각 변경 사항은 해당 버그/패치 항목으로 연결됩니다.

파이썬 버그 추적기 호스팅은 남아프리카 공화국 스텔렌보스에 위치한 Upfront Systems <https://upfrontsoftware.co.za>`__에서 제공해 주셨습니다. Martin von Löwis는 SourceForge에서 기존 버그와 패치를 가져오는 데 많은 노력을 기울였으며, 이 임포트 작업에 사용된 그의 스크립트는 ``https://svn.python.org/view/tracker/importer/` 에 있으며 SourceForge에서 Roundup으로 이동하려는 다른 프로젝트에도 유용할 수 있습니다.

더 보기

https://bugs.python.org

파이썬 버그 추적기.

https://bugs.jython.org:

Jython 버그 추적기.

https://roundup.sourceforge.io/

Roundup 다운로드 및 문서.

https://svn.python.org/view/tracker/importer/

Martin von Löwis의 변환 스크립트.

새로운 문서 형식: Sphinx를 사용한 reStructuredText

파이썬 프로젝트가 시작된 1989년경부터 파이썬 문서는 LaTeX를 사용하여 작성되었습니다. 1980년대와 1990년대 초반에는 대부분의 문서가 온라인에서 조회되기보다 나중에 공부하기 위해 인쇄되어 사용되었습니다. LaTeX는 마크업 기본 규칙을 배우기만 하면 쓰기 쉽고 출력물이 멋지게 나오기 때문에 널리 사용되었습니다.

오늘날에도 인쇄용 출판물을 작성할 때는 여전히 LaTeX가 사용되지만, 프로그래밍 도구의 환경은 변했습니다. 우리는 더 이상 대량의 문서를 인쇄하지 않으며, 대신 온라인에서 확인하고 HTML이 가장 중요한 지원 형식으로 자리 잡았습니다. 불행히도 LaTeX를 HTML로 변환하는 것은 꽤 복잡하며, 오랜 기간 파이썬 문서 편집을 맡았던 Fred L. Drake Jr.는 전환 과정을 유지하는 데 많은 시간을 할애했습니다. 때때디 문서를 SGML 또는 XML로 변환하자는 의견이 나오기도 했지만, 제대로 된 전환을 수행하는 것은 매우 큰 작업이었고 이를 완수하기 위해 필요한 시간과 노력을 투입할 수 있는 사람이 없었습니다.

2.6 개발 주기 동안 Georg Brandl은 문서를 처리하기 위한 새로운 툴체인을 구축하는 데 많은 노력을 기울였습니다. 그 결과물로 만들어진 패키지의 이름은 Sphinx이며, https://www.sphinx-doc.org/에서 이용할 수 있습니다.

Sphinx는 세련된 스타일의 현대적인 HTML을 생성하는 데 중점을 두며, 출력물은 여전히 LaTeX로 변환하여 인쇄할 수 있습니다. 입력 형식은 파이썬 커뮤니티에서 흔히 사용되는 맞춤형 확장 및 지시문을 지원하는 마크업 구문인 reStructuredText입니다.

Sphinx는 작성을 위해 사용할 수 있는 독립적인 패키지이며, 약 24개의 다른 프로젝트(Sphinx 웹 사이트에 나열됨: <https://www.sphinx-doc.org/en/master/examples.html>)들이 Sphinx를 문서화 도구로 채택했습니다.

더 보기

파이썬 문서화하기

Python 문서 작성 방법을 설명합니다.

Sphinx

Sphinx 도구 체인에 대한 문서와 코드입니다.

Docutils

기본 reStructuredText 파서 및 도구 세트입니다.

PEP 343: ‘with’ 문

이전 버전인 Python 2.5에서는 from __future__ import with_statement 지시어로 활성화할 수 있는 선택적 기능으로 ‘with’ 문을 추가했습니다. 2.6 버전부터는 이 문장을 특별하게 활성화할 필요가 없습니다. 이는 with`가 이제 항상 키워드임을 의미합니다. 섹션의 나머지 부분은 "What's New in Python 2.5" 문서의 해당 섹션을 복사한 것이며, Python 2.5의 ':keyword:!with`’ 문에 익숙하다면 이 섹션을 건너뛰어도 됩니다.

with 문은 기존에 정리 코드가 실행되는지 확인하기 위해 try...finally 블록을 사용하던 코드를 명확하게 해줍니다. 이 섹션에서는 이 문장이 일반적으로 어떻게 사용되는지 논의하고, 다음 섹션에서 구현 세부 사항과 이 문법을 지원하는 객체를 작성하는 방법을 설명하겠습니다.

with’ 문은 다음과 같은 기본 구조를 가진 제어 흐름 구조입니다:

with expression [as variable]:
    with-block

표현식이 평가되며, 그 결과로 컨텍스트 관리 프로토콜을 지원하는 객체(즉, __enter__()__exit__() 메서드를 가진 객체)가 반환되어야 합니다.

객체의 __enter__()with-block 이 실행되기 전에 호출되어 설정 코드를 실행할 수 있습니다. 또한 제공된 경우 결과값이 변수 라는 이름으로 바인딩될 수 있습니다. (주의: 변수표현식 의 결과가 할당되는 것은 아닙니다.)

with-block 실행이 끝나면 블록에서 예외가 발생했더라도 객체의 __exit__() 메서드가 호출되어 정리 코드를 수행할 수 있습니다.

일부 표준 파이썬 객체가 이제 컨텍스트 관리 프로토콜을 지원하며 ‘with’ 문과 함께 사용할 수 있습니다. 파일 객체가 그 예시 중 하나입니다:

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

이 문장이 실행된 후, 블록 중간에 for 루프가 예외를 발생시켰더라도 f 의 파일 객체는 자동으로 닫힙니다.

참고

이 경우, __enter__()self 를 반환하기 때문에 fopen() 에 의해 생성된 것과 동일한 객체입니다.

threading 모듈의 락(lock)과 조건 변수도 ‘with’ 문을 지원합니다:

lock = threading.Lock()
with lock:
    # 코드의 임계 영역
    ...

블록이 실행되기 전에 락을 획득하고, 블록이 완료되면 항상 해제합니다.

decimal 모듈의 localcontext() 함수는 계산에 필요한 정밀도와 반올림 특성을 캡슐화하는 현재 decimal 컨텍스트를 쉽게 저장하고 복원할 수 있게 해줍니다:

from decimal import Decimal, Context, localcontext

# 기본 정밀도 28자리로 표시
v = Decimal('578')
print v.sqrt()

with localcontext(Context(prec=16)):
    # 이 블록의 모든 코드는 16자리의 정밀도를 사용합니다.
    # 블록을 나가면 원래 컨텍스트로 복구됩니다.
    print v.sqrt()

컨텍스트 관리자 작성하기

내부적으로 ‘with’ 문은 상당히 복잡합니다. 대부분의 사용자는 기존 객체와 함께 ‘with’를 사용할 뿐 이러한 세부 사항을 알 필요가 없으므로, 원하는 경우 이 섹션의 나머지 부분은 건너뛰어도 좋습니다. 새로운 객체를 만드는 작성자는 기본 구현의 상세 내용을 이해해야 하므로 계속 읽어 나가야 합니다.

컨텍스트 관리 프로토콜에 대한 고수준 설명은 다음과 같습니다:

  • 표현식이 평가되어 “컨텍스트 관리자”라고 불리는 객체가 생성되어야 합니다. 컨텍스트 관리자는 반드시 __enter__()__exit__() 메서드를 가져야 합니다.

  • 컨텍스트 관리자의 __enter__() 메서드가 호출됩니다. 반환된 값은 VAR 에 할당됩니다. as VAR 절이 없는 경우, 해당 값은 단순히 버려집니다.

  • BLOCK 내의 코드가 실행됩니다.

  • BLOCK 에서 예외가 발생하면 컨텍스트 관리자의 __exit__() 메서드가 세 개의 인자(예외 상세 정보인 type, value, traceback; 이는 sys.exc_info() 가 반환하는 값과 동일하며, 예외가 발생하지 않은 경우 None 일 수 있음)와 함께 호출됩니다. 이 메서드의 반환 값은 예외를 다시 발생시킬지 여부를 결정합니다. 어떤 거짓(false) 값이라도 예외를 재발생시키며, True 인 경우 예외를 억제합니다. 예외를 억제하는 경우는 드문데, 예외를 억제하면 ‘with ‘ 문을 포함하는 코드의 작성자가 오류가 발생했다는 사실을 알 수 없기 때문입니다.

  • BLOCK 에서 예외가 발생하지 않더라도 __exit__() 메서드는 여전히 호출되지만, type, value, traceback 은 모두 None 입니다.

예제를 통해 생각해 보겠습니다. 상세한 코드를 제시하지는 않겠지만 트랜잭션을 지원하는 데이터베이스에 필요한 메서드들을 간략하게 스케치하겠습니다.

(데이터베이스 용어가 익숙하지 않은 분들을 위한 설명: 데이터베이스에 대한 일련의 변경 사항은 트랜잭션으로 그룹화됩니다. 트랜잭션은 모든 변경 사항이 데이터베이스에 기록되는 커밋(committed)되거나, 모든 변경 사항이 폐기되어 데이터베이스가 변하지 않는 롤백(rolled back)될 수 있습니다. 자세한 내용은 데이터베이스 교과서를 참조하십시오.)

데이터베이스 연결을 나타내는 객체가 있다고 가정해 보겠습니다. 우리의 목표는 사용자가 다음과 같이 코드를 작성할 수 있게 하는 것입니다:

db_connection = DatabaseConnection()
with db_connection as cursor:
    cursor.execute('insert into ...')
    cursor.execute('delete from ...')
    # ... 추가 작업 ...

블록 내의 코드가 문제없이 실행되면 트랜잭션을 커밋하고, 예외가 발생하면 롤백해야 합니다. 다음은 제가 가정하는 DatabaseConnection 의 기본 인터페이스입니다:

class DatabaseConnection:
    # Database interface
    def cursor(self):
        "Returns a cursor object and starts a new transaction"
    def commit(self):
        "Commits current transaction"
    def rollback(self):
        "Rolls back current transaction"

__enter__() 메서드는 새 트랜잭션을 시작하기만 하면 되므로 꽤 간단합니다. 이 애플리케이션의 경우 결과로 생성된 커서 객체가 유용하므로, 해당 메서드는 이를 반환합니다. 그러면 사용자는 ‘with ‘ 문에 as cursor 를 추가하여 커서를 변수 이름에 바인딩할 수 있습니다.

class DatabaseConnection:
    ...
    def __enter__(self):
        # Code to start a new transaction
        cursor = self.cursor()
        return cursor

__exit__() 메서드는 대부분의 작업이 수행되어야 하는 곳이므로 가장 복잡합니다. 이 메서드는 예외 발생 여부를 확인해야 합니다. 예외가 없으면 트랜잭션이 커밋되고, 예외가 있으면 트랜잭션이 롤백됩니다.

아래 코드에서 실행은 함수의 끝까지 진행되고 기본값인 None 을 반환합니다. None 은 False이므로 예외가 자동으로 재발생합니다. 원한다면 표시된 위치에 return 문을 추가하여 더 명시적으로 작성할 수도 있습니다.

class DatabaseConnection:
    ...
    def __exit__(self, type, value, tb):
        if tb is None:
            # No exception, so commit
            self.commit()
        else:
            # Exception occurred, so rollback.
            self.rollback()
            # return False

contextlib 모듈

contextlib 모듈은 ‘with’ 문과 함께 사용할 객체를 작성할 때 유용한 몇 가지 함수와 데코레이터를 제공합니다.

이 데코레이터는 @~contextlib.contextmanager 이며, 새로운 클래스를 정의하는 대신 단일 제너레이터 함수를 작성할 수 있게 해줍니다. 제너레이터는 정확히 하나의 값을 yield해야 합니다. yield 이전의 코드는 __enter__() 메서드로 실행되고, yield된 값은 ;존재하는 경우; ‘with ‘ 문의 as 절에 바인딩되는 메서드의 반환값이 됩니다. yield 이후의 코드는 __exit__() 메서드에서 실행됩니다. 블록 내에서 발생하는 모든 예외는 yield 문에 의해 발생됩니다.

이 데코레이터를 사용하면 이전 섹션의 데이터베이스 예제를 다음과 같이 작성할 수 있습니다:

from contextlib import contextmanager

@contextmanager
def db_transaction(connection):
    cursor = connection.cursor()
    try:
        yield cursor
    except:
        connection.rollback()
        raise
    else:
        connection.commit()

db = DatabaseConnection()
with db_transaction(db) as cursor:
    ...

contextlib 모듈에는 여러 개의 컨텍스트 관리자를 결합하는 nested(mgr1, mgr2, ...) 함수가 있어 중첩된 ‘with’ 문을 작성할 필요가 없습니다. 이 예제에서는 단일 ‘with’ 문이 데이터베이스 트랜잭션을 시작함과 동시에 스레드 락을 획득합니다:

lock = threading.Lock()
with nested (db_transaction(db), lock) as (cursor, locked):
    ...

마지막으로, closing() 함수는 인자를 반환하여 변수에 바인딩할 수 있게 하고, 블록이 끝날 때 해당 인자의 .close() 메서드를 호출합니다.

import urllib, sys
from contextlib import closing

with closing(urllib.urlopen('http://www.yahoo.com')) as f:
    for line in f:
        sys.stdout.write(line)

더 보기

PEP 343 - “with” 문

Guido van Rossum과 Nick Coghlan이 작성하고 Mike Bland, Guido van Rossum, Neal Norwitz가 구현한 PEP입니다. 이 PEP는 ‘with’ 문을 위해 생성된 코드를 보여주며, 해당 문장이 어떻게 작동하는지 배우는 데 도움이 될 수 있습니다.

contextlib 모듈에 대한 설명서입니다.

PEP 366: 메인 모듈로부터의 명시적 상대 임포트

파이썬의 -m 옵션은 모듈을 스크립트로 실행하게 해줍니다. 패키지 내에 위치한 모듈을 실행할 때, 상대 임포트가 올바르게 작동하지 않았습니다.

Python 2.6용 수정 사항은 module.__package__ 속성을 추가합니다. 이 속성이 존재하면, 상대 임포트는 __name__ 속성 대신 이 속성의 값을 기준으로 합니다.

PEP 302 스타일의 임포터는 필요한 경우 __package__ 를 설정할 수 있습니다. -m 옵션을 구현하는 runpy 모듈이 이제 이 작업을 수행하므로, 패키지 내부에서 실행되는 스크립트에서도 상대 임포트가 올바르게 작동합니다.

PEP 370: 사용자별 site-packages 디렉터리

파이썬을 실행할 때, 모듈 검색 경로인 sys.path 에는 보통 경로가 "site-packages" 로 끝나는 디렉터리가 포함됩니다. 이 디렉터리는 기기나 특정 사이트 설치를 사용하는 모든 사용자가 사용할 수 있는 로컬에 설치된 패키지를 저장하기 위한 용도입니다.

Python 2.6은 사용자별 사이트 디렉터리에 대한 관례를 도입했습니다. 디렉터리는 플랫폼에 따라 달라집니다:

  • Unix 및 Mac OS X: ~/.local/

  • Windows: %APPDATA%/Python

이 디렉터리 내에는 Unix/Mac OS에서는 lib/python2.6/site-packages, Windows에서는 Python26/site-packages 와 같이 버전에 따른 하위 디렉터리가 생성됩니다.

기본 디렉터리가 마음에 들지 않는 경우 환경 변수로 대체할 수 있습니다. PYTHONUSERBASE`는 기능을 지원하는 모든 파이썬 버전에서 사용되는 루트 디렉터리를 설정합니다. Windows에서는 :envvar:!APPDATA` 환경 변수를 설정하여 애플리케이션 전용 데이터 디렉터리를 변경할 수 있습니다. 또한 설치된 파이썬의 site.py 파일을 수정할 수도 있습니다.

파이썬을 실행할 때 -s 옵션을 사용하거나 PYTHONNOUSERSITE 환경 변수를 설정하여 이 기능을 완전히 비활성화할 수 있습니다.

더 보기

PEP 370 - 사용자별 site-packages 디렉터리

Christian Heimes가 작성하고 구현한 PEP.

PEP 371: multiprocessing 패키지

새로운 multiprocessing 패키지는 파이썬 프로그램이 계산을 수행하고 부모 프로세스에 결과를 반환하는 새 프로세스를 생성할 수 있게 해줍니다. 부모 및 자식 프로세스는 큐와 파이프를 사용하여 통신하고, 잠금(lock)과 세마포어(semaphore)를 사용하여 작업을 동기화하며, 단순한 데이터 배열을 공유할 수 있습니다.

multiprocessing 모듈은 처음에는 스레드 대신 프로세스를 사용하여 threading 모듈을 정확하게 에뮬레이션하는 것으로 시작했습니다. 그 목표는 Python 2.6으로 가는 과정에서 사라졌지만, 모듈의 일반적인 접근 방식은 여전히 유사합니다. 핵심 클래스는 Process 이며, 호출 가능한 객체와 인자 모음을 전달받습니다. start() 메서드는 서브프로세스에서 해당 호출 가능 객체를 실행하며, 그 이후에 is_alive() 메서드를 호출하여 서브프로세스가 여전히 실행 중인지 확인하고, join() 메서드를 호출하여 프로세스가 종료될 때까지 기다릴 수 있습니다.

서브프로세스가 계승(factorial)을 계산하는 간단한 예제입니다. 계산을 수행하는 함수는 입력 인자가 4의 배수일 때 실행 시간이 훨씬 더 오래 걸리도록 독특하게 작성되었습니다.

import time
from multiprocessing import Process, Queue


def factorial(queue, N):
    "Compute a factorial."
    # If N is a multiple of 4, this function will take much longer.
    if (N % 4) == 0:
        time.sleep(.05 * N/4)

    # Calculate the result
    fact = 1L
    for i in range(1, N+1):
        fact = fact * i

    # Put the result on the queue
    queue.put(fact)

if __name__ == '__main__':
    queue = Queue()

    N = 5

    p = Process(target=factorial, args=(queue, N))
    p.start()
    p.join()

    result = queue.get()
    print 'Factorial', N, '=', result

계승 결과를 전달하기 위해 Queue 가 사용됩니다. Queue 객체는 전역 변수에 저장됩니다. 자식 프로세스는 생성될 때의 해당 변수 값을 사용하며, 이는 Queue 이므로 부모와 자식 모두 이 객체를 사용하여 통신할 수 있습니다. (부모가 전역 변수의 값을 변경하더라도 자식의 값은 영향을 받지 않으며 그 반대도 마찬가지입니다.)

PoolManager 라는 두 개의 다른 클래스가 더 높은 수준의 인터페이스를 제공합니다. Pool 은 고정된 수의 작업자 프로세스를 생성하며, 단일 요청을 추가하려면 apply() 또는 apply_async() 를 호출하여 워커에 배분하고, 여러 개의 요청을 추가하려면 map() 또는 map_async() 를 호출할 수 있습니다. 다음 코드는 Pool 을 사용하여 5개의 작업자 프로세스에 요청을 분산하고 결과 리스트를 가져옵니다:

from multiprocessing import Pool

def factorial(N, dictionary):
    "Compute a factorial."
    ...
p = Pool(5)
result = p.map(factorial, range(1, 1000, 10))
for v in result:
    print v

이것은 다음과 같은 출력을 생성합니다:

1
39916800
51090942171709440000
8222838654177922817725562880000000
33452526613163807108170062053440751665152000000000
...

다른 고수준 인터페이스인 Manager 클래스는 Python 데이터 구조의 마스터 복사본을 보유할 수 있는 별도의 서버 프로세스를 생성합니다. 다른 프로세스들은 프록시 객체를 사용하여 이러한 데이터 구조에 접근하고 수정할 수 있습니다. 다음 예제는 dict() 메서드를 호출하여 공유 딕셔너리를 생성하며, 작업자 프로세스는 이 딕셔너리에 값을 삽입합니다. (이 예제에서는 자동으로 잠금 처리가 되지 않지만 중요하지 않습니다. Manager 의 메서드에는 공유 잠금을 생성하기 위한 Lock(), RLock(), 및 Semaphore() 도 포함됩니다.)

import time
from multiprocessing import Pool, Manager

def factorial(N, dictionary):
    "Compute a factorial."
    # Calculate the result
    fact = 1L
    for i in range(1, N+1):
        fact = fact * i

    # Store result in dictionary
    dictionary[N] = fact

if __name__ == '__main__':
    p = Pool(5)
    mgr = Manager()
    d = mgr.dict()         # Create shared dictionary

    # Run tasks using the pool
    for N in range(1, 1000, 10):
        p.apply_async(factorial, (N, d))

    # Mark pool as closed -- no more tasks can be added.
    p.close()

    # Wait for tasks to exit
    p.join()

    # Output results
    for k, v in sorted(d.items()):
        print k, v

이 코드는 다음과 같은 출력을 생성합니다:

1 1
11 39916800
21 51090942171709440000
31 8222838654177922817725562880000000
41 33452526613163807108170062053440751665152000000000
51 15511187532873822802242430164693032110632597200169861120000...

더 보기

multiprocessing 모듈에 대한 설명서입니다.

PEP 371 - multiprocessing 패키지 추가

Jesse Noller와 Richard Oudkerk가 작성하고, Richard Oudkerk와 Jesse Noller가 구현한 PEP입니다.

PEP 3101: 고급 문자열 포매팅

Python 3.0에서는 % 연산자가 더 강력한 문자열 포매팅 메서드인 format() 으로 보완됩니다. str.format() 메서드에 대한 지원은 Python 2.6으로 백포트되었습니다.

2.6에서는 8비트 및 Unicode 문자열 모두가 문자열을 템플릿으로 취급하고 포매팅할 인수를 받는 .format() 메서드를 가집니다. 포매팅 템플릿은 중괄호({, })를 특수 문자로 사용합니다:

>>> # 문자열에 위치 인자 0을 대입합니다.
>>> "User ID: {0}".format("root")
'User ID: root'
>>> # 이름이 지정된 키워드 인수를 사용합니다
>>> "User ID: {uid}   Last seen: {last_login}".format(
...    uid="root",
...    last_login = "5 Mar 2008 07:20")
'User ID: root   Last seen: 5 Mar 2008 07:20'

중괄호는 중첩하여 이스케이프할 수 있습니다:

>>> "Empty dict: {{}}".format()
"Empty dict: {}"

필드 이름은 {0}, {1} 등과 같이 위치 인자를 나타내는 정수이거나 키워드 인자의 이름일 수 있습니다. 또한 속성을 읽거나 딕셔너리 키에 접근하는 복합 필드 이름을 제공할 수도 있습니다:

>>> import sys
>>> print 'Platform: {0.platform}\nPython version: {0.version}'.format(sys)
Platform: darwin
Python version: 2.6a1+ (trunk:61261M, Mar  5 2008, 20:29:41)
[GCC 4.0.1 (Apple Computer, Inc. build 5367)]'

>>> import mimetypes
>>> 'Content-type: {0[.mp4]}'.format(mimetypes.types_map)
'Content-type: video/mp4'

[.mp4] 와 같은 딕셔너리 스타일 표기법을 사용할 때 문자열 주위에 따옴표를 넣을 필요가 없으며, .mp4 를 키로 사용하여 값을 찾습니다. 숫자로 시작하는 문자열은 정수로 변환됩니다. 포맷 문자열 내에 더 복잡한 표현식을 작성할 수는 없습니다.

지금까지 결과 문자열에서 어떤 필드를 대체할지 지정하는 방법을 살펴보았습니다. 콜론 뒤에 포맷 지정자를 추가하여 정확한 포매팅 방식도 제어할 수 있습니다. 예를 들면 다음과 같습니다:

>>> # 필드 0: 왼쪽 정렬, 15자 공간 확보
>>> # 필드 1: 오른쪽 정렬, 6자 공간 확보
>>> fmt = '{0:15} ${1:>6}'
>>> fmt.format('Registration', 35)
'Registration    $    35'
>>> fmt.format('Tutorial', 50)
'Tutorial        $    50'
>>> fmt.format('Banquet', 125)
'Banquet         $   125'

포맷 지정자는 중첩을 통해 다른 필드를 참조할 수 있습니다:

>>> fmt = '{0:{1}}'
>>> width = 15
>>> fmt.format('Invoice #1234', width)
'Invoice #1234  '
>>> width = 35
>>> fmt.format('Invoice #1234', width)
'Invoice #1234                      '

원하는 너비 내에서 필드의 정렬은 다음과 같이 지정할 수 있습니다:

문자

효과

< (기본값)

왼쪽 정렬

>

오른쪽 정렬

^

중앙 정렬

=

(수치 타입 전용) 부호 뒤에 채우기.

포맷 지정자에는 값의 포매팅 방식을 제어하는 표현 유형(presentation type)을 포함할 수도 있습니다. 예를 들어, 부동 소수점 숫자를 일반 숫자나 지수 표기법으로 포매팅할 수 있습니다:

>>> '{0:g}'.format(3.75)
'3.75'
>>> '{0:e}'.format(3.75)
'3.750000e+00'

다양한 표현 유형이 제공됩니다. 전체 목록 을 참조하십시오. 다음은 예시입니다:

b

Binary. 숫자를 2진법으로 출력합니다.

c

Character. 인쇄하기 전에 정수를 해당 유니코드 문자로 변환합니다.

d

Decimal Integer. 숫자를 10진법으로 출력합니다.

o

Octal format. 숫자를 8진법으로 출력합니다.

x

Hex format. 9 이상의 숫자에 소문자를 사용하여 16진법으로 출력합니다.

e

Exponent notation. 지수를 나타내는 ‘e’를 사용하여 숫자를 과학적 표기법으로 인쇄합니다.

g

General format. 고정 소수점 형식으로 인쇄하되, 숫자가 너무 크면 ‘e’ 지수 표기법으로 전환합니다.

n

Number. 현재 로케일 설정을 사용하여 숫자에 적절한 구분 기호를 삽입한다는 점을 제외하면 ‘g’(부동 소수점의 경우) 또는 ‘d’(정수의 경우)와 동일합니다.

%

Percentage. 숫자에 100을 곱하고 백분율 기호 앞에 고정(‘f’) 형식으로 표시합니다.

클래스 및 타입은 포매팅 방식을 제어하기 위해 __format__() 메서드를 정의할 수 있습니다. 이 메서드는 단일 인자인 포맷 지정자를 받습니다:

def __format__(self, format_spec):
    if isinstance(format_spec, unicode):
        return unicode(str(self))
    else:
        return str(self)

단일 값을 포매팅하는 format() 내장 함수도 있습니다. 이 함수는 제공된 지정자를 사용하여 해당 타입의 __format__() 메서드를 호출합니다:

>>> format(75.6564, '.2f')
'75.66'

더 보기

포맷 문자열 문법

포맷 필드에 대한 참고 문서.

PEP 3101 - Advanced String Formatting

Talin이 작성하고 Eric Smith가 구현한 PEP입니다.

PEP 3105: print As a Function

print() 문은 Python 3.0에서 print() 함수가 됩니다. print() 를 함수로 만들면 def print(...) 으로 함수를 대체하거나 다른 곳에서 새 함수를 임포트하는 것이 가능해집니다.

Python 2.6에서는 __future__ 임포트를 통해 문법으로서의 print 을 제거하고 기능적 형태를 사용할 수 있습니다. 예시는 다음과 같습니다:

>>> from __future__ import print_function
>>> print('# of entries', len(dictionary), file=sys.stderr)

새 함수의 시그니처는 다음과 같습니다:

def print(*args, sep=' ', end='\n', file=None)

매개 변수는 다음과 같습니다:

  • args: 출력될 값들이 포함된 위치 인자입니다.

  • sep: 인자 사이에 출력될 구분자입니다.

  • end: 모든 인자가 출력된 후 출력될 종료 텍스트입니다.

  • file: 출력이 전송될 파일 객체입니다.

더 보기

PEP 3105 - Make print a function

Georg Brandl가 작성한 PEP입니다.

PEP 3110: Exception-Handling Changes

Python 프로그래머가 종종 저지르는 실수 중 하나는 다음과 같은 코드를 작성하는 것입니다:

try:
    ...
except TypeError, ValueError:  # 잘못됨!
    ...

작성자는 아마도 TypeErrorValueError 예외를 모두 잡으려 했겠지만, 이 코드는 실제로 다른 동작을 수행합니다. 즉, TypeError 를 잡고 그 결과를 로컬 이름 "ValueError" 에 바인딩합니다. ValueError 예외는 전혀 잡히지 않습니다. 올바른 코드는 다음과 같이 예외 튜플을 지정해야 합니다:

try:
    ...
except (TypeError, ValueError):
    ...

이 에러는 쉼표 사용이 모호하기 때문에 발생합니다. 즉, 파싱 트리에서 두 개의 서로 다른 노드를 의미하는지, 아니면 튜플인 하나의 노드를 의미하는지 알 수 없습니다.

Python 3.0에서는 쉼표를 “as”라는 단어로 대체하여 이를 모호하지 않게 만듭니다. 예외를 잡고 예외 객체를 exc 변수에 저장하려면 다음과 같이 작성해야 합니다:

try:
    ...
except TypeError as exc:
    ...

Python 3.0은 “as” 사용만 지원하므로 첫 번째 예시를 두 개의 서로 다른 예외를 잡는 것으로 해석합니다. Python 2.6은 쉼표와 “as”를 모두 지원하므로 기존 코드는 계속 작동합니다. 따라서 2.6에서 실행될 새로운 Python 코드를 작성할 때는 “as”를 사용할 것을 권장합니다.

더 보기

PEP 3110 - Catching Exceptions in Python 3000

Collin Winter가 작성하고 구현한 PEP입니다.

PEP 3112: Byte Literals

Python 3.0은 유니코드를 기본 문자열 타입으로 채택하고, 8비트 리터럴을 b'string' 또는 bytes 생성자를 사용하여 다르게 표시합니다. 향후 호환성을 위해 Python 2.6은 bytesstr 타입의 별칭으로 추가하며, b'' 표기법도 지원합니다.

Python 2.6의 str() 는 3.0의 bytes 타입과 여러 면에서 다르며, 특히 생성자가 완전히 다릅니다. 3.0에서 bytes([65, 66, 67])`ABC 를 나타내는 바이트가 포함된 3개 요소의 리스트이지만, 2.6에서 ``bytes([65, 66, 67])` 는 리스트의 str 표현을 의미하는 12바이트 문자열을 반환합니다.

The primary use of bytes in 2.6 will be to write tests of object type such as isinstance(x, bytes). This will help the 2to3 converter, which can’t tell whether 2.x code intends strings to contain either characters or 8-bit bytes; you can now use either bytes or str to represent your intention exactly, and the resulting code will also be correct in Python 3.0.

모든 문자열 리터럴을 유니코드 문자열로 변환하는 __future__ 임포트도 있습니다. 이것은 \u 이스케이프 시퀀스를 사용하여 유니코드 문자를 포함할 수 있음을 의미합니다:

from __future__ import unicode_literals

s = ('\u751f\u3080\u304e\u3000\u751f\u3054'
     '\u3081\u3000\u751f\u305f\u307e\u3054')

print len(s)               # 12 유니코드 문자

At the C level, Python 3.0 will rename the existing 8-bit string type, called PyStringObject in Python 2.x, to PyBytesObject. Python 2.6 uses #define to support using the names PyBytesObject(), PyBytes_Check(), PyBytes_FromStringAndSize(), and all the other functions and macros used with strings.

bytes 타입의 인스턴스는 문자열과 마찬가지로 불변입니다. 새로운 bytearray 타입은 가변적인 바이트 시퀀스를 저장합니다.

>>> bytearray([65, 66, 67])
bytearray(b'ABC')
>>> b = bytearray(u'\u21ef\u3244', 'utf-8')
>>> b
bytearray(b'\xe2\x87\xaf\xe3\x89\x84')
>>> b[0] = '\xe3'
>>> b
bytearray(b'\xe3\x87\xaf\xe3\x89\x84')
>>> unicode(str(b), 'utf-8')
u'\u31ef \u3244'

바이트 배열은 startswith()/endswith(), find()/rfind() 와 같은 문자열 타입의 대부분의 메서드와 append(), pop(), 그리고 reverse() 와 같은 리스트의 일부 메서드를 지원합니다.

>>> b = bytearray('ABC')
>>> b.append('d')
>>> b.append(ord('e'))
>>> b
bytearray(b'ABCde')

PyByteArray_FromObject(), PyByteArray_FromStringAndSize() 및 기타 다양한 함수를 포함하는 상응하는 C API도 존재합니다.

더 보기

PEP 3112 - 파이썬 3000의 바이트 리터럴

Jason Orendorff가 작성한 PEP이며, Christian Heimes에 의해 2.6으로 백포트되었습니다.

PEP 3116: 새로운 I/O 라이브러리

파이썬 내장 파일 객체는 여러 메서드를 지원하지만, 파일과 유사한 객체가 반드시 모든 메서드를 지원하는 것은 아닙니다. 파일을 모방하는 객체는 대개 read()write() 를 지원하지만, 예를 들어 readline() 은 지원하지 않을 수 있습니다. 파이썬 3.0은 기본 읽기 및 쓰기 동작에서 버퍼링 및 텍스트 처리 기능을 분리하는 계층형 I/O 라이브러리를 io 모듈에 도입했습니다.

io 모듈에서 제공하는 세 가지 수준의 추상 베이스 클래스가 있습니다:

  • RawIOBase 는 원시 I/O 작업을 정의합니다: read(), readinto(), write(), seek(), tell(), truncate(), 그리고 close(). 이 클래스의 대부분의 메서드는 대개 단일 시스템 호출로 매핑됩니다. 또한 특정 객체가 허용하는 작업을 판단하기 위한 readable(), writable(), 그리고 seekable() 메서드도 있습니다.

    파이썬 3.0은 이 클래스에 대해 파일과 소켓용 구체적인 구현을 포함하고 있지만, 파이썬 2.6은 파일과 소켓 객체를 이런 방식으로 재구성하지 않았습니다.

  • BufferedIOBase 는 사용되는 시스템 호출 횟수를 줄이기 위해 메모리에서 데이터를 버퍼링하여 I/O 처리를 더욱 효율적으로 만드는 추상 베이스 클래스입니다. 이 클래스는 RawIOBase 의 모든 메서드를 지원하며, 기반이 되는 원시 객체를 보유하는 raw 속성을 추가합니다.

    이 ABC를 구현하는 다섯 가지 구체적인 클래스가 있습니다. BufferedWriterBufferedReader 는 무작위 액세스를 위해 seek() 메서드를 갖는 쓰기 전용 또는 읽기 전용 사용을 지원하는 객체를 위한 것입니다. BufferedRandom 객체들은 동일한 기본 스트림에 대해 읽기와 쓰기 접근을 지원하며, BufferedRWPair 는 연결되지 않은 데이터 스트림에 읽기 및 쓰기 작업이 작용하는 TTY와 같은 객체를 위한 것입니다. BytesIO 클래스는 메모리 버퍼를 통해 읽기, 쓰기, 검색을 지원합니다.

  • TextIOBase: 문자열 읽기 및 쓰기 기능(파이썬 3.0에서 문자열은 유니코드임에 주의)을 제공하고, 유니버설 개행 을 지원합니다. TextIOBasereadline() 메서드를 정의하며 객체에 대한 반복을 지원합니다.

    두 가지 구체적인 구현이 있습니다. TextIOWrapper 는 버퍼링된 I/O 객체를 래핑하여 모든 텍스트 I/O 메서드를 지원하고, 기반 객체에 접근하기 위한 buffer 속성을 추가합니다. StringIO 는 디스크에 아무것도 쓰지 않고 모든 것을 메모리에 버퍼링합니다.

    (파이썬 2.6에서 io.StringIO`는 순수 파이썬으로 구현되어 상당히 느립니다. 따라서 현재로서는 기존의 :mod:!StringIO` 또는 cStringIO 모듈을 계속 사용해야 합니다. 향후 어느 시점에 파이썬 3.0의 io 모듈이 성능을 위해 C로 재작성될 예정이며, 그때가 되면 해당 C 구현이 2.x 버전으로 백포트될 수도 있습니다.)

파이썬 2.6에서 기본 구현은 io 모듈의 클래스를 기반으로 구축되도록 재구성되지 않았습니다. 이 모듈은 파이썬 3.0과 호환되는 코드를 더 쉽게 작성하고, 개발자가 버퍼링 및 텍스트 I/O를 위한 자체 구현을 직접 작성하는 수고를 줄이기 위해 제공됩니다.

더 보기

PEP 3116 - 새로운 I/O

Daniel Stutzbach, Mike Verdone 및 Guido van Rossum이 작성한 PEP입니다. 코드는 Guido van Rossum, Georg Brandl, Walter Doerwald, Jeremy Hylton, Martin von Löwis, Tony Lownds 등이 참여했습니다.

PEP 3118: 개정된 버퍼 프로토콜

버퍼 프로토콜은 파이썬 타입이 내부 표현에 대한 포인터를 교환할 수 있게 하는 C 레벨 API입니다. 예를 들어 메모리 매핑된 파일은 문자들의 버퍼로 간주될 수 있으며, 이를 통해 re 와 같은 다른 모듈이 메모리 매핑된 파일을 검색해야 할 문자열로 취급할 수 있습니다.

버퍼 프로토콜의 주요 사용자는 NumPy와 같은 수치 처리 패키지이며, 이들은 호출자가 더 느린 API를 거치는 대신 배열에 직접 데이터를 쓸 수 있도록 배열의 내부 표현을 노출합니다. 이 PEP는 NumPy 개발 경험을 바탕으로 버퍼 프로토콜을 업데이트하며, 배열의 모양(shape) 표시 또는 메모리 영역 잠금과 같은 여러 새로운 기능을 추가합니다.

가장 중요한 새로운 C API 함수는 PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags) 이며, 이 함수는 객체와 일련의 플래그를 받아 결과로 얻은 Py_buffer 구조체에 해당 객체의 메모리 표현에 대한 정보를 채웁니다. 객체는 외부 호출자가 내용을 수정하는 동안 메모리를 고정하기 위해 이 동작을 사용할 수 있으며, 이에 대응하여 외부 호출이 완료되었음을 알리는 PyBuffer_Release(Py_buffer *view) 가 존재합니다.

PyObject_GetBuffer()flags 인자는 반환되는 메모리에 대한 제약 조건을 지정합니다. 몇 가지 예는 다음과 같습니다.

  • PyBUF_WRITABLE 은 메모리가 쓰기 가능해야 함을 나타냅니다.

  • PyBUF_LOCK 은 메모리에 대해 읽기 전용 또는 독점 잠금을 요청합니다.

  • PyBUF_C_CONTIGUOUSPyBUF_F_CONTIGUOUS 는 각각 C-연속(마지막 차원이 가장 빠르게 변함) 또는 포트란-연속(첫 번째 차원이 가장 빠르게 변함) 배열 레이아웃을 요청합니다.

PyArg_ParseTuple() 을 위한 두 가지 새로운 인자 코드인 s*z* 는 파라미터에 대해 잠긴 버퍼 객체를 반환합니다.

더 보기

PEP 3118 - 버퍼 프로토콜 개정

Travis Oliphant와 Carl Banks가 작성하고 Travis Oliphant가 구현한 PEP입니다.

PEP 3119: 추상 베이스 클래스

Java와 같은 일부 객체 지향 언어는 클래스가 주어진 메서드 집합을 가지거나 특정 접근 프로토콜을 지원함을 선언하는 인터페이스를 지원합니다. 추상 베이스 클래스(ABC)는 파이썬에서 이와 동일한 기능을 제공합니다. ABC 지원은 ABCMeta 라고 불리는 메타클래스를 포함하는 abc 모듈, 이 메타클래스에 대한 isinstance()issubclass() 내장 함수들의 특별한 처리, 그리고 파이썬 개발자들이 널리 유용할 것이라고 판단한 기본 ABC 컬렉션으로 구성됩니다. 향후 파이썬 버전에서는 더 많은 ABC가 추가될 것입니다.

특정 클래스가 딕셔너리 스타일 접근을 지원하는지 알고 싶다고 가정해 봅시다. 하지만 “딕셔너리 스타일”이라는 표현은 모호합니다. 아마도 obj[1] 로 항목에 접근하는 것이 작동한다는 의미일 것입니다. 그것이 obj[2] = value 로 항목 설정이 가능하다는 것을 의미할까요? 아니면 객체가 keys(), values(), 및 items() 메서드를 가질 것인가요? iterkeys() 와 같은 반복자 변형은 어떻습니까? 그리고 copy()update() 는요? iter() 로 객체를 반복하는 것은요?

파이썬 2.6의 collections 모듈은 이러한 차이점을 나타내는 여러 다양한 ABC를 포함합니다. Iterable 은 클래스가 __iter__() 를 정의함을 나타내며, Container 는 클래스가 __contains__() 메서드를 정의하여 x in y 표현을 지원함을 의미합니다. 아이템 가져오기, 아이템 설정, 그리고 keys(), values(), 및 items() 와 같은 기본적인 딕셔너리 인터페이스는 MutableMapping ABC에 의해 정의됩니다.

특정 ABC로부터 자신의 클래스를 파생시켜 해당 ABC의 인터페이스를 지원함을 나타낼 수 있습니다.

import collections

class Storage(collections.MutableMapping):
    ...

대신, 원하는 ABC로부터 파생시키지 않고 클래스를 작성한 뒤 ABC의 register() 메서드를 호출하여 클래스를 등록할 수도 있습니다.

import collections

class Storage:
    ...

collections.MutableMapping.register(Storage)

직접 작성하는 클래스의 경우 ABC를 파생시키는 것이 아마 더 명확할 것입니다. register() 메서드는 기존 유형이나 클래스를 설명할 수 있는 새로운 ABC를 작성했거나, 제3자 클래스가 특정 ABC를 구현함을 선언하려는 경우에 유용합니다. 예를 들어, PrintableType ABC를 정의했다면 다음과 같이 하는 것이 허용됩니다.

# 파이썬 타입 등록
PrintableType.register(int)
PrintableType.register(float)
PrintableType.register(str)

클래스는 ABC에 의해 명시된 의미를 따라야 하지만, 파이썬은 이를 확인할 수 없습니다. 따라서 클래스 제작자가 ABC의 요구 사항을 이해하고 그에 맞게 코드를 구현해야 합니다.

객체가 특정 인터페이스를 지원하는지 확인하려면 이제 다음과 같이 작성할 수 있습니다.

def func(d):
    if not isinstance(d, collections.MutableMapping):
        raise ValueError("Mapping object expected, not %r" % d)

위 예시와 같이 많은 체크를 작성해야 한다고 느낄 필요는 없습니다. 파이썬은 명시적인 타입 검사를 수행하지 않고, 객체에 메서드가 존재할 것이라고 믿고 호출하며 없으면 예외를 발생시키는 덕 타이핑(duck-typing) 전통이 강합니다. ABC를 확인하는 것은 신중하게 결정하고 반드시 필요한 경우에만 수행하십시오.

클래스 정의에서 abc.ABCMeta 를 메타 클래스로 사용하여 자신만의 ABC를 작성할 수 있습니다:

from abc import ABCMeta, abstractmethod

class Drawable():
    __metaclass__ = ABCMeta

    @abstractmethod
    def draw(self, x, y, scale=1.0):
        pass

    def draw_doubled(self, x, y):
        self.draw(x, y, scale=2.0)


class Square(Drawable):
    def draw(self, x, y, scale):
        ...

위의 Drawable ABC에서, draw_doubled() 메서드는 객체를 두 배 크기로 렌더링하며 Drawable 에 기술된 다른 메서드들을 기반으로 구현될 수 있습니다. 따라서 이 ABC를 구현하는 클래스들은 draw_doubled() 를 직접 구현할 필요는 없지만, 원한다면 구현할 수도 있습니다. 하지만 draw() 의 구현은 반드시 필요합니다. ABC가 유용한 범용 구현을 제공할 수 없기 때문입니다.

반드시 구현해야 하는 draw() 와 같은 메서드에 @~abc.abstractmethod 데코레이터를 적용할 수 있습니다. 이 경우 파이썬은 해당 메서드를 정의하지 않은 클래스에 대해 예외를 발생시킵니다. 주의할 점은, 메서드가 없는 하위 클래스의 인스턴스를 실제로 생성하려고 할 때만 예외가 발생한다는 것입니다:

>>> class Circle(Drawable):
...     pass
...
>>> c = Circle()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class Circle with abstract methods draw
>>>

추상 데이터 속성은 @abstractproperty 데코레이터를 사용하여 선언할 수 있습니다:

from abc import abstractproperty
...

@abstractproperty
def readonly(self):
   return self._x

그 후 하위 클래스는 readonly 프로퍼티를 정의해야 합니다.

더 보기

PEP 3119 - 추상 베이스 클래스(Abstract Base Classes) 도입

Guido van Rossum과 Talin이 작성한 PEP. Guido van Rossum이 구현했습니다. Benjamin Aranguren과 Alex Martelli가 2.6 버전으로 백포트했습니다.

PEP 3127: 정수 리터럴 지원 및 구문

Python 3.0은 8진수 정수 리터럴의 구문을 변경하여 앞선 0 대신 “0o” 또는 “0O” 접두사를 사용하며, “0b” 또는 “0B” 접두사로 표시되는 2진수 정수 리터럴에 대한 지원을 추가합니다.

Python 2.6은 8진수를 나타내는 앞선 0에 대한 지원을 제거하지 않으면서, “0o” 및 “0b”에 대한 지원을 추가합니다:

>>> 0o21, 2*8 + 1
(17, 17)
>>> 0b101111
47

oct() 내장 함수는 여전히 앞에 0이 붙은 숫자를 반환하며, 새로운 bin() 내장 함수는 숫자의 2진수 표현을 반환합니다:

>>> oct(42)
'052'
>>> future_builtins.oct(42)
'0o52'
>>> bin(173)
'0b10101101'

int()long() 내장 함수는 8진수 또는 2진수가 요청되거나, base 인자가 0인 경우(사용할 기반을 문자열에서 결정해야 함을 의미함) “0o” 및 “0b” 접두사를 수용합니다:

>>> int ('0o52', 0)
42
>>> int('1101', 2)
13
>>> int('0b1101', 2)
13
>>> int('0b1101', 0)
13

더 보기

PEP 3127 - 정수 리터럴 지원 및 구문

Patrick Maupin이 작성한 PEP. Eric Smith가 2.6 버전으로 백포트했습니다.

PEP 3129: 클래스 데코레이터

데코레이터가 함수에서 클래스로 확장되었습니다. 이제 다음과 같이 작성하는 것이 허용됩니다:

@foo
@bar
class A:
  pass

이는 다음과 동등합니다:

class A:
  pass

A = foo(bar(A))

더 보기

PEP 3129 - 클래스 데코레이터

Collin Winter가 작성한 PEP.

PEP 3141: 숫자를 위한 타입 계층 구조

Python 3.0은 Scheme의 숫자 타워에서 영감을 받아 수치 형을 위한 여러 추상 베이스 클래스를 추가했습니다. 이 클래스들은 numbers 모듈로서 2.6 버전으로 백포트되었습니다.

가장 일반적인 ABC는 Number 입니다. 이는 어떠한 연산도 정의하지 않으며, 오직 isinstance(obj, Number) 를 통해 객체가 숫자인지 확인할 수 있도록 존재합니다.

ComplexNumber 의 하위 클래스입니다. 복소수는 덧셈, 뺄셈, 곱셈, 나눗셈 및 거듭제곱과 같은 기본 연산을 수행할 수 있으며, 실수부와 허수부를 가져오고 숫자의 켤레 복소수를 구할 수 있습니다. 파이썬 내장 complex 타입은 Complex 의 구현체입니다.

RealComplex 로부터 더 파생되며, 실수에서만 작동하는 연산인 floor(), trunc(), 반올림, N으로 나눈 나머지 구하기, 몫(floor division) 및 비교를 추가합니다.

Rational 숫자는 Real 에서 파생되며, numeratordenominator 속성을 가지고 float로 변환될 수 있습니다. Python 2.6은 fractions 모듈에 간단한 유리수 클래스인 Fraction 을 추가했습니다. (numbers.Rational 과 이름이 충돌하는 것을 피하기 위해 Rational 대신 Fraction 으로 명명되었습니다.)

Integral 숫자는 Rational 에서 파생되며, <<>> 로 왼쪽 및 오른쪽 시프트가 가능하고, &| 와 같은 비트 연산으로 조합할 수 있으며, 배열 인덱스 및 슬라이스 경계로 사용할 수 있습니다.

Python 3.0에서 이 PEP는 기존 내장 함수인 round(), math.floor(), math.ceil() 을 약간 재정의하고, 새로운 기능인 math.trunc() 를 추가하며, 이는 Python 2.6으로 백포트되었습니다. math.trunc() 는 0을 향해 반올림하여 함수의 인자와 0 사이에 있는 가장 가까운 Integral 값을 반환합니다.

더 보기

PEP 3141 - 숫자를 위한 타입 계층 구조

Jeffrey Yasskin이 작성한 PEP.

Guile 매뉴얼에서 발췌한 Scheme의 숫자 타워 <https://www.gnu.org/software/guile/manual/html_node/Numerical-Tower.html#Numerical-Tower>`__.

R5RS Scheme 사양에서 발췌한 Scheme의 숫자 데이터 타입 <https://conservatory.scheme.org/schemers/Documents/Standards/R5RS/HTML/r5rs-Z-H-9.html#%_sec_6.2>`__.

fractions 모듈

수치형 타입의 계층 구조를 완성하기 위해 fractions 모듈은 유리수 클래스를 제공합니다. 유리수는 값을 분모와 분소로 구성된 분수로 저장하며, 부동 소수점으로는 근사만 가능한 2/3 와 같은 숫자를 정확하게 표현할 수 있습니다.

Fraction 생성자는 결과 분수의 분자와 분모가 될 두 개의 Integral 값을 받습니다.

>>> from fractions import Fraction
>>> a = Fraction(2, 3)
>>> b = Fraction(2, 5)
>>> float(a), float(b)
(0.66666666666666663, 0.40000000000000002)
>>> a+b
Fraction(16, 15)
>>> a/b
Fraction(5, 3)

부동 소수점을 유리수로 변환하기 위해, 이제 float 타입은 동일한 부동 소수점 값을 가진 분수의 분자와 분모를 반환하는 as_integer_ratio() 메서드를 가집니다:

>>> (2.5) .as_integer_ratio()
(5, 2)
>>> (3.1415) .as_integer_ratio()
(7074029114692207L, 2251799813685248L)
>>> (1./3) .as_integer_ratio()
(6004799503160661L, 18014398509481984L)

1./3과 같이 부동 소수점으로만 근사할 수 있는 값은 근사되는 숫자로 단순화되지 않습니다. 분수는 부동 소수점 값을 정확하게 일치시키려고 시도합니다.

fractions 모듈은 오랫동안 파이썬의 Demo/classes/ 디렉토리에 있던 Sjoerd Mullender의 구현을 기반으로 합니다. 이 구현은 Jeffrey Yasskin에 의해 크게 업데이트되었습니다.

이외의 언어 변경 사항

핵심 파이썬 언어에 가해진 일부 작은 변경 사항은 다음과 같습니다:

  • __main__.py 파일을 포함하는 디렉토리와 zip 아카이브를 인터프리터에 이름을 전달하여 직접 실행할 수 있습니다. 해당 디렉토리나 zip 아카이브는 sys.path의 첫 번째 항목으로 자동 삽입됩니다. (Andy Chu가 제안 및 초기 패치를 수행하고, 이후 Phillip J. Eby와 Nick Coghlan이 수정했습니다. bpo-1739468.)

  • hasattr() 함수는 모든 오류를 잡아내고 무시했는데, 이는 오류가 발생하면 어떤 식으로든 __getattr__() 메서드가 실패한 것이고 따라서 hasattr() 의 반환값이 False 일 것이라는 가정에 기반한 것이었습니다. 그러나 이 논리는 KeyboardInterruptSystemExit 에는 적용되어서는 안 됩니다. 파이썬 2.6은 이제 hasattr() 에서 이러한 예외를 만나도 무시하지 않습니다. (Benjamin Peterson이 수정했습니다; bpo-2196.)

  • 키워드 인자를 제공하기 위해 ** 구문을 사용하여 함수를 호출할 때, 더 이상 파이썬 딕셔너리를 사용할 필요가 없습니다. 이제 모든 매핑이 작동합니다:

    >>> def f(**kw):
    ...    print sorted(kw)
    ...
    >>> ud=UserDict.UserDict()
    >>> ud['a'] = 1
    >>> ud['b'] = 'string'
    >>> f(**ud)
    ['a', 'b']
    

    (Alexander Belopolsky 기여; bpo-1686487.)

    함수 호출 시 *args 인자 뒤에 키워드 인자를 제공하는 것도 허용됩니다.

    >>> def f(*args, **kw):
    ...     print args, kw
    ...
    >>> f(1,2,3, *(4,5,6), keyword=13)
    (1, 2, 3, 4, 5, 6) {'keyword': 13}
    

    이전에는 이것이 구문 오류로 처리되었을 것입니다. (Amaury Forgeot d’Arc 기여; bpo-3473.)

  • 새로운 내장 함수 next(iterator, [default]) 는 지정된 이터레이터에서 다음 항목을 반환합니다. default 인자가 제공된 경우, iterator 가 소진되면 해당 값이 반환됩니다. 그렇지 않으면 StopIteration 예외가 발생합니다. (bpo-2719 에서 백포트됨.)

  • 튜플은 이제 리스트 타입의 index()count() 메서드와 동일한 기능을 하는 index()count() 메서드를 가집니다:

    >>> t = (0,1,2,3,4,0,1,2)
    >>> t.index(3)
    3
    >>> t.count(0)
    2
    

    (Raymond Hettinger 기여)

  • 내장 타입은 이제 확장된 슬라이싱 구문을 위한 향상된 지원을 제공하며, (start, stop, step) 의 다양한 조합을 수용합니다. 이전에는 지지 범위가 제한적이어서 특정 예외 상황에서 작동하지 않았습니다. (Thomas Wouters 구현.)

  • 이제 프로퍼티에는 기존 프로퍼티에 getter, setter 또는 deleter 함수를 추가하기 위한 유용한 단축 기능을 제공하는 세 가지 데코레이터인 @~property.getter, @~property.setter@~property.deleter 가 있습니다. 다음과 같이 사용합니다:

    class C(object):
        @property
        def x(self):
            return self._x
    
        @x.setter
        def x(self, value):
            self._x = value
    
        @x.deleter
        def x(self):
            del self._x
    
    class D(C):
        @C.x.getter
        def x(self):
            return self._x * 2
    
        @x.setter
        def x(self, value):
            self._x = value / 2
    
  • 내장 세트 타입의 여러 메서드가 이제 여러 이터러블을 수용합니다: intersection(), intersection_update(), union(), update(), difference()difference_update().

    >>> s=set('1234567890')
    >>> s.intersection('abc123', 'cdf246')  # 모든 입력의 교집합
    set(['2'])
    >>> s.difference('246', '789')
    set(['1', '0', '3', '5'])
    

    (Raymond Hettinger가 기여했습니다.)

  • 많은 부동 소수점 기능이 추가되었습니다. 이제 float() 함수는 nan 문자열을 IEEE 754 Not A Number 값으로, +inf-inf 를 양의 무한대 또는 음의 무한대로 변환합니다. 이는 IEEE 754 의미론을 따르는 모든 플랫폼에서 작동합니다. (Christian Heimes 기여; bpo-1635.)

    math 모듈의 다른 함수인 isinf()isnan`은 부동 소수점 인자가 무한이거나 숫자가 아닌 경우(Not A Number)에 True를 반환합니다. (:issue:`1640())

    부동 소수점을 16진수 문자열로 변환하는 기능이 추가되었습니다(bpo-3008). 이 함수들은 10진수와 2진수 간의 변환 과정에서 발생하는 반올림 오차 없이 부동 소수점과 문자열 표현을 상호 변환합니다. 부동 소수점은 문자열 표현을 반환하는 hex() 메서드를 가지며, float.fromhex() 메서드는 문자열을 다시 숫자로 변환합니다:

    >>> a = 3.75
    >>> a.hex()
    '0x1.e000000000000p+1'
    >>> float.fromhex('0x1.e000000000000p+1')
    3.75
    >>> b=1./3
    >>> b.hex()
    '0x1.5555555555555p-2'
    
  • 수치적 개선 사항: 부호 있는 0(-0 및 +0)을 지원하는 시스템에서 두 개의 부동 소수점으로 복소수를 생성할 때, 이제 complex() 생성자가 0의 부호를 유지합니다. (Mark T. Dickinson이 수정; bpo-1507.)

  • 부모 클래스로부터 __hash__() 메서드를 상속받은 클래스는 __hash__ = None 을 설정하여 해당 클래스가 해시 가능하지 않음을 표시할 수 있습니다. 이렇게 하면 hash(obj)TypeError 를 발생시키며, 해당 클래스는 Hashable ABC를 구현하는 것으로 간주되지 않습니다.

    객체를 식별자가 아닌 값으로 비교하는 __cmp__() 또는 __eq__() 메서드를 정의했을 때 이 방법을 사용해야 합니다. 모든 객체는 id(obj) 를 해시 값으로 사용하는 기본 해시 메서드를 가집니다. 부모 클래스에서 상속된 __hash__() 메서드를 깔끔하게 제거할 방법이 없으므로, None 을 할당하는 방식이 덮어쓰기로 구현되었습니다. C 수준에서는 확장 기능이 tp_hashPyObject_HashNotImplemented() 로 설정할 수 있습니다. (Nick Coghlan과 Amaury Forgeot d’Arc가 수정; bpo-2235.)

  • GeneratorExit 예외가 이제 Exception 대신 BaseException 을 하위 클래스로 가집니다. 이는 except Exception: 과 같은 예외 처리기에서 GeneratorExit 를 실수로 잡지 않게 됨을 의미합니다. (Chad Austin이 기여; bpo-1537.)

  • 제너레이터 객체에 이제 제너레이터를 뒷받침하는 원래 코드 객체를 가리키는 gi_code 어트리뷰트가 추가되었습니다. (Collin Winter가 기여; bpo-1473257.)

  • compile() 내장 함수가 이제 위치 매개변수뿐만 아니라 키워드 인자도 수용합니다. (Thomas Wouters가 기여; bpo-1444529.)

  • complex() 생성자가 이제 괄호로 묶인 복소수를 포함하는 문자열을 수용하며, 이는 complex(repr(cplx)) 가 값을 변환 후 다시 원상태로 되돌릴 수 있음을 의미합니다. 예를 들어, complex('(3+4j)') 는 이제 (3+4j)를 반환합니다. (bpo-1491866)

  • 문자열 translate() 메서드가 이제 변환 표 매개변수로 None 을 수용하며, 이 경우 항등 변환으로 취급됩니다. 이를 통해 문자를 삭제하는 작업만 수행하는 것이 더 용이해졌습니다. (Bengt Richter가 기여하고 Raymond Hettinger가 구현; bpo-1193128.)

  • 내장 dir() 함수가 이제 전달받은 객체에 대해 __dir__() 메서드가 있는지 확인합니다. 이 메서드는 객체의 유효한 속성 이름을 포함하는 문자열 리스트를 반환해야 하며, 이를 통해 객체가 dir() 이 생성하는 값을 제어할 수 있습니다. __getattr__() 또는 __getattribute__() 메서드를 가진 객체는 이를 사용하여 처리 가능한 가짜(pseudo) 속성을 알릴 수 있습니다. (bpo-1591665)

  • 인스턴스 메서드 객체에 해당 메서드를 구성하는 객체와 함수를 위한 새 어트리뷰트가 추가되었습니다. im_self 의 새로운 동의어는 __self__ 이며, im_func__func__ 로도 사용 가능합니다. 이전 이름들은 Python 2.6에서 여전히 지원되지만 3.0에서는 삭제되었습니다.

  • 알기 어려운 변경 사항: class 문 내에서 locals() 함수를 사용할 때 생성되는 딕셔너리가 더 이상 자유 변수를 반환하지 않습니다. (이 경우, 자유 변수란 class 문에서 참조되지만 클래스의 속성이 아닌 변수를 의미합니다.)

최적화

  • warnings 모듈이 C로 재작성되었습니다. 이를 통해 파서에서 경고를 발생시키는 것이 가능해졌으며, 인터프리터 시작 속도 또한 빨라질 수 있습니다. (Neal Norwitz와 Brett Cannon이 기여; bpo-1631171.)

  • 타입 객체가 이제 메서드 캐시를 보유하여 특정 클래스에 대한 올바른 메서드 구현을 찾는 데 필요한 작업을 줄여줍니다. 일단 캐싱되면 인터프리터는 어떤 메서드를 호출할지 결정하기 위해 기본 클래스를 탐색할 필요가 없습니다. 기반 클래스나 해당 클래스 자체가 수정되면 캐시가 비워지므로, Python의 동적 특성 속에서도 캐시는 정확하게 유지됩니다. (Armin Rigo가 처음 구현하고 Kevin Jacobs가 Python 2.6을 위해 업데이트; bpo-1700288.)

    기본적으로 이 변경 사항은 Python 코어에 포함된 타입에만 적용됩니다. 확장 모듈은 이 캐시와 호환되지 않을 수 있으므로, 메서드 캐시를 활성화하려면 모듈의 tp_flags 필드에 Py_TPFLAGS_HAVE_VERSION_TAG 을 명시적으로 추가해야 합니다. (메서드 캐시와 호환되려면 확장 모듈 코드가 구현하는 어떤 타입의 tp_dict 멤버도 직접 접근하거나 수정해서는 안 됩니다. 대부분의 모듈은 이렇게 하지 않지만, Python 인터프리터가 이를 판단하는 것은 불가능합니다. 자세한 논의는 bpo-1878 을 참조하십시오.)

  • 키워드 인자를 사용하는 함수 호출이 빠른 포인터 비교를 수행함으로써 성능이 크게 향상되었으며, 일반적으로 전체 문자열 비교 시간을 절약합니다. (Antoine Pitrou의 초기 구현 이후 Raymond Hettinger가 기여; bpo-1819.)

  • struct 모듈의 모든 함수가 Need For Speed 스프린트 작업 덕분에 C로 재작성되었습니다. (Raymond Hetlinger이 기여.)

  • 일부 표준 내장 타입이 이제 자신의 타입 객체에 비트를 설정합니다. 이를 통해 특정 객체가 이러한 타입의 하위 클래스인지 확인하는 속도가 빨라졌습니다. (Neal Norwitz가 기여.)

  • Unicode 문자열이 이제 공백과 줄 바꿈을 감지하는 데 더 빠른 코드를 사용하며, 이로 인해 split() 메서드는 약 25%, splitlines() 는 35% 빨라졌습니다. (Antoine Pitrou가 기여.) Unicode 문자열 데이터에 pymalloc을 사용하여 메모리 사용량도 줄어들었습니다.

  • with 문이 이제 __exit__() 메서드를 스택에 저장하여 약간의 속도 향상을 제공합니다. (Jeffrey Yasskin이 구현.)

  • 메모리 사용량을 줄이기 위해, 가비지 컬렉터는 가장 높은 세대의 객체를 수거할 때 내부의 빈 리스트를 정리합니다. 이를 통해 운영체제에 메모리를 더 빨리 반환할 수 있습니다.

인터프리터 변경 사항

두 가지 명령줄 옵션이 다른 Python 구현체에서 사용하도록 예약되었습니다. -J 스위치는 Jython용 특정 옵션(예: 하부 JVM에 전달되는 스위치)을 위해 예약되었으며, -X 는 CPython, Jython 또는 IronPython과 같은 특정 Python 구현체의 옵션을 위해 예약되었습니다. Python 2.6에서 이 중 하나를 사용하면 인터프리터가 해당 옵션이 현재 사용되지 않음을 알립니다.

Python 인터프리터에 -B 스위치를 제공하거나 실행 전에 PYTHONDONTWRITEBYTECODE 환경 변수를 설정하여 Python이 .pyc 또는 .pyo 파일을 생성하지 않도록 막을 수 있습니다. 이 설정은 Python 프로그램에서 sys.dont_write_bytecode 변수로 접근 가능하며, Python 코드를 통해 값을 변경하여 인터프리터 동작을 수정할 수 있습니다. (Neal Norwitz와 Georg Brandl이 기여.)

표준 입력, 출력 및 표준 에러에 사용되는 인코딩은 인터프리터 실행 전 PYTHONIOENCODING 환경 변수를 설정하여 지정할 수 있습니다. 값은 <인코딩> 또는 <인코딩>:<오류처리기> 형식의 문자열이어야 합니다. 인코딩 부분은 utf-8 이나 latin-1 과 같은 인코딩 이름을 지정하며, 선택적 항목인 오류처리기 는 인코딩으로 처리할 수 없는 문자를 어떻게 처리할지 결정합니다. 이때 오류처리기는 “error”, “ignore” 또는 “replace” 중 하나여야 합니다. (Martin von Löwis가 기여.)

새롭고 개선된 모듈

모든 릴리스와 마찬가지로, Python 표준 라이브러리에는 여러 개선 사항과 버그 수정이 포함되었습니다. 다음은 모듈 이름 알파벳 순으로 정렬된 주요 변경 사항의 일부입니다. 소스 트리의 Misc/NEWS 파일을 참조하여 더 완전한 목록을 확인하거나 Subversion 로그를 통해 상세 내용을 확인할 수 있습니다.

  • asyncoreasynchat 모듈이 다시 활발하게 유지 관리되고 있으며, 다수의 패치와 버그 수정이 적용되었습니다. (Josiah Carlson이 관리; 한 패치는 bpo-1736190 참조.)

  • The bsddb module also has a new maintainer, Jesús Cea Avión, and the package is now available as a standalone package. The web page for the package is www.jcea.es/programacion/pybsddb.htm. The plan is to remove the package from the standard library in Python 3.0, because its pace of releases is much more frequent than Python’s.

    bsddb.dbshelve 모듈은 이제 프로토콜 1로 제한되지 않고 사용 가능한 가장 높은 피클링 프로토콜을 사용합니다. (W. Barnes가 기여.)

  • cgi 모듈이 이제 HTTP POST 요청의 쿼리 문자열에서 변수를 읽어옵니다. 이를 통해 “/cgi-bin/add.py?category=1”과 같이 쿼리 문자열을 포함하는 URL에 폼 액션을 사용하는 것이 가능해졌습니다. (Alexandre Fiori와 Nubis가 기여; bpo-1817.)

    parse_qs()parse_qsl() 함수가 cgi 모듈에서 urlparse 모듈로 이동되었습니다. cgi 모듈에 여전히 남아 있는 버전은 2.6에서 PendingDeprecationWarning 메시지를 발생시킵니다(bpo-600362).

  • cmath 모듈이 Mark Dickinson과 Christian Heimes의 기여로 광범위하게 개편되었습니다. 다섯 개의 새로운 함수가 추가되었습니다:

    • polar() 는 복소수를 극좌표 형식으로 변환하며, 복소수의 크기와 편각을 반환합니다.

    • rect() 은 그 반대 작업을 수행하며, 크기와 편각 쌍을 해당 복소수로 변환합니다.

    • phase() 는 복소수의 편각(각도라고도 함)을 반환합니다.

    • isnan() 은 인수의 실수부 또는 허수 부분이 NaN인 경우 True를 반환합니다.

    • isinf() 는 인수의 실수부 또는 허수 부분이 무한대인 경우 True를 반환합니다.

    개편을 통해 cmath 모듈의 수치적 정확성도 향상되었습니다. 모든 함수에 대해, 가능할 때마다 결과값의 실수부와 허수 부분이 최소 정밀도 단위(ulps) 내에서 정확하게 산출됩니다. 자세한 내용은 bpo-1381 을 참조하십시오. 또한 asinh(), atanh(), atan() 에 대한 분기점이 수정되었습니다.

    모듈 테스트가 대폭 확장되었으며, 약 2,000개의 새로운 테스트 케이스가 대수 함수들을 검증합니다.

    IEEE 754 플랫폼에서 cmath 모듈은 이제 C99 표준의 부록 ‘G’와 일치하는 방식으로 IEEE 754 특수 값 및 부동 소수점 예외를 처리합니다.

  • collections 모듈에 새로운 데이터 타입인 namedtuple(typename, fieldnames) 가 추가되었습니다. 이는 표준 튜플의 서브클래스를 생성하는 팩토리 함수로, 필드에 인덱스뿐만 아니라 이름으로도 접근할 수 있습니다. 예시는 다음과 같습니다:

    >>> var_type = collections.namedtuple('variable',
    ...             'id name type size')
    >>> # 이름은 공백이나 쉼표로 구분됩니다.
    >>> # 'id, name, type, size'도 가능합니다.
    >>> var_type._fields
    ('id', 'name', 'type', 'size')
    
    >>> var = var_type(1, 'frequency', 'int', 4)
    >>> print var[0], var.id    # 동일함
    1 1
    >>> print var[2], var.type  # 동일함
    int int
    >>> var._asdict()
    {'size': 4, 'type': 'int', 'id': 1, 'name': 'frequency'}
    >>> v2 = var._replace(name='amplitude')
    >>> v2
    variable(id=1, name='amplitude', type='int', size=4)
    

    표준 라이브러리에서 튜플을 반환하던 여러 곳이 namedtuple() 인스턴스를 반환하도록 수정되었습니다. 예를 들어, Decimal.as_tuple() 메서드는 이제 sign, digits, exponent 필드를 가진 네임드 튜플을 반환합니다.

    (Raymond Hettinger가 기여했습니다.)

  • collections 모듈의 또 다른 변경 사항으로, deque 타입이 선택적 maxlen 파라미터를 지원합니다. 이 파라미터가 제공되면 덱(deque)의 크기는 최대 maxlen 개로 제한됩니다. 가득 찬 덱에 더 많은 항목을 추가하면 오래된 항목이 삭제됩니다.

    >>> from collections import deque
    >>> dq=deque(maxlen=3)
    >>> dq
    deque([], maxlen=3)
    >>> dq.append(1); dq.append(2); dq.append(3)
    >>> dq
    deque([1, 2, 3], maxlen=3)
    >>> dq.append(4)
    >>> dq
    deque([2, 3, 4], maxlen=3)
    

    (Raymond Hettinger가 기여했습니다.)

  • Cookie 모듈의 Morsel 객체가 이제 httponly 속성을 지원합니다. 일부 브라우저에서는 이 속성이 설정된 쿠키를 JavaScript 코드로 접근하거나 조작할 수 없습니다. (Arvin Schnell이 기여; bpo-1638033.)

  • curses 모듈에 새로운 윈도우 메서드인 chgat() 이 추가되었으며, 이는 한 줄 내 특정 수의 문자에 대한 표시 속성을 변경합니다. (Fabian Kreutz가 기여.)

    # y=0, x=21에서 시작하여
    # 해당 줄의 나머지 부분에 영향을 주는 굵은 글씨체.
    stdscr.chgat(0, 21, curses.A_BOLD)
    

    curses.textpad 모듈의 Textbox 클래스가 이제 덮어쓰기(overwrite) 모드뿐만 아니라 삽입(insert) 모드에서의 편집도 지원합니다. Textbox 인스턴스를 생성할 때 insert_mode 파라미터에 참(true) 값을 전달하여 삽입 모드를 활성화할 수 있습니다.

  • datetime 모듈의 strftime() 메서드가 이제 %f 포맷 코드를 지원합니다. 이는 객체의 마이크로초 수를 왼쪽에 0을 채워 여섯 자리로 확장합니다. (Skip Montanaro가 기여; bpo-1158.)

  • decimal 모듈이 the General Decimal Specification 버전 1.66로 업데이트되었습니다. 새로운 기능에는 exp()log10() 과 같은 몇 가지 기본 수학 함수를 위한 메서드들이 포함됩니다:

    >>> Decimal(1).exp()
    Decimal("2.718281828459045235360287471")
    >>> Decimal("2.7182818").ln()
    Decimal("0.9999999895305022877376682436")
    >>> Decimal(1000).log10()
    Decimal("3")
    

    Decimal 객체의 as_tuple() 메서드는 이제 sign, digits, exponent 필드를 가진 네임드 튜플을 반환합니다.

    (Facundo Batista와 Mark Dickinson이 구현했습니다. 네임드 튜플 지원은 Raymond Hettinger가 추가했습니다.)

  • difflib 모듈의 SequenceMatcher 클래스는 이제 일치 항목을 나타내는 네임드 튜플을 반환하며, 이 튜플은 a, b, size 속성을 포함합니다. (Raymond Hettinger가 기여.)

  • ftplib.FTP 클래스 생성자와 connect() 메서드에 초 단위로 측정되는 선택적 timeout 파라미터가 추가되었습니다. (Facundo Batista가 추가.) 또한, FTP 클래스의 storbinary()storlines`는 이제 데이터 전송 데이터 블록과 함께 호출될 선택적인 *callback* 파라미터를 받습니다. (Phil Schwartz가 기여; :issue:`1221598().)

  • reduce() 내장 함수를 functools 모듈에서도 사용할 수 있습니다. Python 3.0에서 해당 내장 기능은 제거되었으며, 이제 reduce()functools 에서만 제공됩니다. 현재 2.x 시리즈에서는 내장 기능을 삭제할 계획이 없습니다. (Christian Heimes가 패치; bpo-1739906.)

  • 가능한 경우, getpass 모듈은 프롬프트 메시지를 출력하고 비밀번호를 읽기 위해 /dev/tty 를 사용하며, 불가능할 경우 표준 에러 및 표준 입력으로 대체합니다. 비밀번호가 터미널에 출력될 가능성이 있는 경우, 프롬프트가 표시되기 전에 경고가 출력됩니다. (Gregory P. Smith가 기여.)

  • glob.glob() 함수는 유니코드 경로가 사용되고 디렉터리 내에서 유니코드 파일명이 일치하는 경우 이제 유니코드 파일명을 반환할 수 있습니다. (bpo-1001604)

  • heapq 모듈에 추가된 새로운 함수인 merge(iter1, iter2, ...) 는 정렬된 순서로 데이터를 반환하는 임의의 수의 이터러블을 입력으로 받아 모든 이터레이터의 내용을 정렬된 순서로 반환하는 새로운 제너레이터를 생성합니다. 예시는 다음과 같습니다:

    >>> list(heapq.merge([1, 3, 5, 9], [2, 8, 16]))
    [1, 2, 3, 5, 8, 9, 16]
    

    또 다른 새 함수인 heappushpop(heap, item)heapitem 을 푸시한 다음 가장 작은 항목을 팝하여 반환합니다. 이는 heappush() 를 호출한 후 heappop() 을 별도로 호출하는 것보다 더 효율적입니다.

    heapq 는 이제 기존에 사용하던 ‘작거나 같은’ 비교 대신 ‘작은’ 비교만 사용하도록 구현됩니다. 이를 통해 heapq 의 타입 활용이 list.sort() 메서드와 일치하게 됩니다. (Raymond Hettinger가 기여.)

  • httplib.HTTPConnectionHTTPSConnection 클래스 생성자에 초 단위로 측정되는 선택적 timeout 파라미터가 추가되었습니다. (Facundo Batista가 추가.)

  • inspect 모듈의 대부분 함수(예: getmoduleinfo()getargs())가 이제 네임드 튜플을 반환합니다. 이러한 결과 값은 튜플처럼 동작할 뿐만 아니라, 요소에 속성으로서 접근할 수도 있습니다. (Raymond Hettinger가 기여.)

    모듈에 추가된 새로운 함수로는 isgenerator(), isgeneratorfunction(), 그리고 isabstract() 가 있습니다.

  • itertools 모듈에 여러 새로운 함수가 추가되었습니다.

    izip_longest(iter1, iter2, ...[, fillvalue]) 은 각 요소로 튜플을 만듭니다. 일부 이터러블이 다른 것보다 짧은 경우 누락된 값은 fillvalue 로 설정됩니다. 예시는 다음과 같습니다:

    >>> tuple(itertools.izip_longest([1,2,3], [1,2,3,4,5]))
    ((1, 1), (2, 2), (3, 3), (None, 4), (None, 5))
    

    product(iter1, iter2, ..., [repeat=N]) 은 제공된 이터러블의 데카르트 곱을 반환하며, 이는 각 이터러블에서 반환된 요소들의 모든 가능한 조합을 포함하는 튜플 세트입니다.

    >>> list(itertools.product([1,2,3], [4,5,6]))
    [(1, 4), (1, 5), (1, 6),
     (2, 4), (2, 5), (2, 6),
     (3, 4), (3, 5), (3, 6)]
    

    선택적 repeat 키워드 인자는 하나의 이터러블 또는 여러 개의 이터러블 세트를 자기 자신과 결합하여 N*번 반복된 곱을 구하는 데 사용됩니다. 단일 이터러블 인자의 경우, *N-튜플이 반환됩니다:

    >>> list(itertools.product([1,2], repeat=3))
    [(1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2),
     (2, 1, 1), (2, 1, 2), (2, 2, 1), (2, 2, 2)]
    

    두 개의 이터러블이 있는 경우, 2N-튜플이 반환됩니다.

    >>> list(itertools.product([1,2], [3,4], repeat=2))
    [(1, 3, 1, 3), (1, 3, 1, 4), (1, 3, 2, 3), (1, 3, 2, 4),
     (1, 4, 1, 3), (1, 4, 1, 4), (1, 4, 2, 3), (1, 4, 2, 4),
     (2, 3, 1, 3), (2, 3, 1, 4), (2, 3, 2, 3), (2, 3, 2, 4),
     (2, 4, 1, 3), (2, 4, 1, 4), (2, 4, 2, 3), (2, 4, 2, 4)]
    

    combinations(iterable, r)iterable 의 요소들로부터 길이가 r 인 부분 시퀀스를 반환합니다.

    >>> list(itertools.combinations('123', 2))
    [('1', '2'), ('1', '3'), ('2', '3')]
    >>> list(itertools.combinations('123', 3))
    [('1', '2', '3')]
    >>> list(itertools.combinations('1234', 3))
    [('1', '2', '3'), ('1', '2', '4'),
     ('1', '3', '4'), ('2', '3', '4')]
    

    permutations(iter[, r]) 은 이터러블 요소의 길이가 r 인 모든 순열을 반환합니다. r 이 지정되지 않은 경우, 해당 이터러블이 생성하는 요소의 수로 기본값이 설정됩니다.

    >>> list(itertools.permutations([1,2,3,4], 2))
    [(1, 2), (1, 3), (1, 4),
     (2, 1), (2, 3), (2, 4),
     (3, 1), (3, 2), (3, 4),
     (4, 1), (4, 2), (4, 3)]
    

    itertools.chain(*iterables)itertools 에 존재하는 함수로 Python 2.6에서 새로운 생성자가 추가되었습니다. itertools.chain.from_iterable(iterable) 은 다른 이터러블을 반환해야 하는 단일 이터러블을 입력으로 받습니다. 그 후 chain() 은 첫 번째 이터러블의 모든 요소, 그다음 두 번째 이터러블의 모든 요소를 이와 같은 방식으로 모두 반환합니다.

    >>> list(itertools.chain.from_iterable([[1,2,3], [4,5,6]]))
    [1, 2, 3, 4, 5, 6]
    

    (모두 Raymond Hettinger가 기여했습니다.)

  • logging 모듈의 FileHandler 클래스와 그 하위 클래스인 WatchedFileHandler, RotatingFileHandler, 및 TimedRotatingFileHandler 에 선택적 delay 파라미터가 추가되었습니다. delay 가 참이면 로그 파일 열기가 첫 번째 emit() 호출이 있을 때까지 지연됩니다. (Vinay Sajip이 기여.)

    TimedRotatingFileHandler 은 또한 utc 생성자 파라미터를 가집니다. 이 인자가 참이면 자정이 언제인지를 결정하고 파일 이름을 생성할 때 UTC 시간이 사용되며, 그렇지 않으면 로컬 시간이 사용됩니다.

  • math 모듈에 여러 새로운 함수가 추가되었습니다:

    • isinf()isnan() 은 주어진 부동 소수점이 각각 (양수 또는 음의) 무한대인지 아니면 NaN(Not a Number)인지 판별합니다.

    • copysign() 은 IEEE 754 수의 부호 비트를 복사하여, x 의 절대값과 y 의 부호 비트를 결합한 값을 반환합니다. 예를 들어, math.copysign(1, -0.0) 은 -1.0을 반환합니다. (Christian Heimes가 기여.)

    • (Raymond Hettinger가 기여; :issue:`2138().)

    • (Jean Brouwers, Raymond Hetlinger, Mark Dickinson이 기여; :issue:`2819().)

    • acosh(), asinh()atanh() 은 역쌍곡선 함수를 계산합니다.

    • log1p()1+x 의 자연로그(밑 e)를 반환합니다.

    • trunc() 은 숫자를 0 방향으로 반올림하며, 함수의 인자와 0 사이에서 가장 가까운 Integral 값을 반환합니다. 이는 PEP 3141의 숫자에 대한 타입 계층 <#pep-3141> 백포트의 일부로 추가되었습니다.

  • math 모듈이 특히 부동 소수점 예외 처리 및 IEEE 754 특수 값과 관련하여 여러 플랫폼에서 더 일관된 동작을 제공하도록 개선되었습니다.

    가능한 경우, 이 모듈은 754의 특수 값에 관한 C99 표준 권고 사항을 따릅니다. 예를 들어, 이제 sqrt(-1.) 은 거의 모든 플랫폼에서 ValueError 를 발생시키며, sqrt(float('NaN')) 은 모든 IEEE 754 플랫폼에서 NaN을 반환합니다. C99 표준 부록 ‘F’에서 ‘divide-by-zero’ 또는 ‘invalid’ 신호를 권장하는 경우 Python은 ValueError 를 발생시킵니다. C99 표준 부록 ‘F’에서 ‘overflow’를 신호로 권장하는 경우 Python은 OverflowError 를 발생시킵니다. (bpo-711019bpo-1640 참조.)

    (Christian Heimes와 Mark Dickinson이 기여했습니다.)

  • mmap 객체에 이제 문자열 끝에서 시작하여 역순으로 하위 문자열을 찾는 rfind() 메서드가 추가되었습니다. 또한 find() 메서드에도 검색을 중단할 인덱스를 지정하는 end 파라미터가 추가되었습니다. (John Lenton이 기여했습니다.)

  • operator 모듈에 이름과 선택적 인자 세트를 받아 전달된 모든 인자에 대해 해당 함수를 호출하는 콜러블을 반환하는 methodcaller() 함수가 추가되었습니다. 예:

    >>> # lambda s: s.replace('old', 'new')와 동일
    >>> replacer = operator.methodcaller('replace', 'old', 'new')
    >>> replacer('old wine in old bottles')
    'new wine in new bottles'
    

    (Gregory Petrosyan의 제안에 따라 Georg Brandl이 기여했습니다.)

    attrgetter() 함수가 이제 점(.)으로 구분된 이름을 수용하며 해당 속성을 조회합니다:

    >>> inst_name = operator.attrgetter(
    ...        '__class__.__name__')
    >>> inst_name('')
    'str'
    >>> inst_name(help)
    '_Helper'
    

    (Barry Warsaw의 제안에 따라 Georg Brandl이 기여했습니다.)

  • os 모듈이 여러 새로운 시스템 콜을 래핑합니다. fchmod(fd, mode)fchown(fd, uid, gid) 는 열려 있는 파일의 모드와 소유권을 변경하며, lchmod(path, mode) 는 심볼릭 링크의 모드를 변경합니다. (Georg Brandl과 Christian Heimes가 기여했습니다.)

    chflags()lchflags() 는 파일에 설정된 플래그를 변경하는 관련 시스템 콜의 래퍼이며, 사용 가능한 환경에서 작동합니다. 플래그 값에 대한 상수는 stat 모듈에 정의되어 있으며, 가능한 값 중에는 파일이 변경될 수 없음을 알리는 UF_IMMUTABLE 과 데이터가 파일 끝에만 추가될 수 있음을 나타내는 UF_APPEND 가 포함됩니다. (M. Levinson이 기여했습니다.)

    os.closerange(low, high) 은 오류를 무시하고 high 는 포함하지 않으면서 low 부터 high 까지의 모든 파일 기술자를 효율적으로 닫습니다. 이 함수는 이제 subprocess 모듈에서 프로세스 시작 속도를 높이기 위해 사용됩니다. (Georg Brandl이 기여했습니다; bpo-1663329.)

  • os.environ 객체의 clear() 메서드는 이제 객체의 키를 삭제하는 것 외에도 os.unsetenv`를 사용하여 환경 변수를 해제합니다. (Martin Horcicka가 기여했습니다; :issue:`1181().)

  • os.walk() 함수에 followlinks 파라미터가 추가되었습니다. True로 설정하면 디렉터리를 가리키는 심볼릭 링크를 따라 해당 디렉터리의 내용을 방문합니다. 하위 호환성을 위해 이 파라미터의 기본값은 False입니다. 부모 디렉터리를 가리키는 심볼릭 링크가 있는 경우 함수가 무한 재귀에 빠질 수 있음에 주의하십시오. (bpo-1273829)

  • os.path 모듈에서 splitext() 함수가 선행 마침표 문자를 기준으로 분할하지 않도록 변경되었습니다. 이는 Unix의 점 파일(dot-files)을 다룰 때 더 나은 결과를 제공합니다. 예를 들어, os.path.splitext('.ipython') 은 이제 ('', '.ipython') 대신 ('.ipython', '') 를 반환합니다. (bpo-1115886)

    새로운 함수인 os.path.relpath(path, start='.') 는 제공된 경우 start 경로로부터 또는 현재 작업 디렉터리에서 대상 path 까지의 상대 경로를 반환합니다. (Richard Barran이 기여했습니다; bpo-1339796.)

    Windows에서 os.path.expandvars`는 이제 "%var%" 형식으로 제공된 환경 변수를 확장하며, "~user"는 사용자의 디렉터리 경로로 확장됩니다. (Josiah Carlson이 기여했습니다; :issue:`957650().)

  • pdb 모듈에서 제공하는 파이썬 디버거에 새로운 명령어가 추가되었습니다: “run”은 디버깅 중인 파이썬 프로그램을 재시작하며, 선택적으로 프로그램에 대한 새로운 명령줄 인수를 받을 수 있습니다. (Rocky Bernstein이 기여했습니다; bpo-1393667.)

  • pdb.post_mortem() 함수는 트레이스백을 디버깅하기 위해 사용되며, 트레이스백이 제공되지 않는 경우 이제 sys.exc_info`가 반환하는 트레이스백을 사용합니다. (Facundo Batista가 기여했습니다; :issue:`1106316().)

  • pickletools 모듈에 피클을 포함하는 문자열을 받아 일부 사용되지 않는 opcode를 제거하고 동일한 데이터 구조를 가진 더 짧은 피클을 반환하는 optimize() 함수가 추가되었습니다. (Raymond Hettinger가 기여했습니다.)

  • pkgutil 모듈에 설치된 파이썬 패키지에 포함된 리소스 파일의 내용을 반환하는 get_data() 함수가 추가되었습니다. 예:

    >>> import pkgutil
    >>> print pkgutil.get_data('test', 'exception_hierarchy.txt')
    BaseException
     +-- SystemExit
     +-- KeyboardInterrupt
     +-- GeneratorExit
     +-- Exception
          +-- StopIteration
          +-- StandardError
     ...
    

    (Paul Moore가 기여했습니다; bpo-2439.)

  • pyexpat 모듈의 Parser 객체는 이제 문자 데이터를 담는 데 사용되는 버퍼의 크기를 변경하기 위해 buffer_size 속성을 설정할 수 있습니다. (Achim Gaedke가 기여했습니다; bpo-1137.)

  • Queue 모듈은 이제 다양한 순서로 항목을 추출하는 큐 변형을 제공합니다. PriorityQueue 클래스는 큐에 쌓인 항목을 힙(heap)에 저장하고 우선순위 순서로 추출하며, LifoQueue 는 가장 최근에 추가된 항목을 먼저 추출하므로 스택처럼 작동합니다. (Raymond Hettinger가 기여했습니다.)

  • random 모듈의 Random 객체는 이제 32비트 시스템에서 피클링하고 64비트 시스템에서 언피클링할 수 있으며, 그 반대의 경우도 가능합니다. 안타깝게도 이 변경으로 인해 파이썬 2.6의 Random 객체를 이전 버전의 파이썬에서 올바르게 언피클링할 수 없게 되었습니다. (Shawn Ligocki가 기여했습니다; bpo-1727780.)

    새로운 triangular(low, high, mode) 함수는 삼각형 분포를 따르는 무작위 숫자를 반환합니다. 반환되는 값은 high 를 포함하지 않고 lowhigh 사이에 있으며, mode 가 해당 분포에서 가장 빈번하게 발생하는 값이 됩니다. (Wladmir van der Laan과 Raymond Hettinger가 기여했습니다; bpo-1681432.)

  • re 모듈에서 수행되는 긴 정규 표현식 검색 시 신호 전달 여부를 확인하므로, 시간이 많이 소요되는 검색을 이제 중단할 수 있습니다. (Josh Hoyt와 Ralf Schmitt가 기여했습니다; bpo-846388.)

    정규 표현식 모듈은 작은 정규식 전용 가상 머신을 위한 바이트코드를 컴파일하여 구현됩니다. 신뢰할 수 없는 코드가 악성 바이트코드 문자열을 직접 생성하여 충돌을 일으킬 수 있으므로, 파이썬 2.6에는 정규식 바이트코드를 검증하는 기능이 포함되어 있습니다. (Guido van Rossum이 Google App Engine 작업 중에 기여했습니다; bpo-3487.)

  • rlcompleter 모듈의 Completer.complete() 메서드는 이제 이름을 평가하는 동안 발생하는 예외를 무시합니다. (Lorenz Quack이 수정했습니다; bpo-2250.)

  • sched 모듈의 scheduler 인스턴스는 이제 스케줄러의 큐 내용을 반환하는 읽기 전용 queue 속성을 가집니다. 이 내용은 (time, priority, action, argument) 필드를 가진 이름 붙은 튜플 리스트로 표현됩니다. (Raymond Hettinger 기여; bpo-1861.)

  • select 모듈에 Linux의 epoll() 및 BSD의 kqueue() 시스템 콜을 위한 래퍼 함수가 추가되었습니다. 기존 poll 객체에 modify() 메서드가 추가되었으며, pollobj.modify(fd, eventmask) 는 파일 기술자 또는 파일 객체와 이벤트 마스크를 받아 해당 파일의 기록된 이벤트 마스크를 수정합니다. (Christian Heimes가 기여했습니다; bpo-1657.)

  • shutil.copytree() 함수에 이제 콜러블 객체를 받는 선택적 ignore 인자가 추가되었습니다. 이 콜러블은 각 디렉터리 경로와 해당 디렉터리 내용의 리스트를 받아 복사하지 않고 무시할 이름들의 리스트를 반환합니다.

    shutil 모듈은 이 새로운 파라미터와 함께 사용할 수 있는 ignore_patterns() 함수도 제공합니다. ignore_patterns`는 임의의 개수의 glob 스타일 패턴을 받아 이러한 패턴 하나라도 일치하는 모든 파일과 디렉터리를 무시하는 콜러블을 반환합니다. 다음 예제는 디렉터리 트리를 복사하지만, `().svn`` 디렉터리와 이름이 ‘~’로 끝나는 Emacs 백업 파일은 건너뜁니다:

    shutil.copytree('Doc/library', '/tmp/library',
                    ignore=shutil.ignore_patterns('*~', '.svn'))
    

    (Tarek Ziadé가 기여했습니다; bpo-2663.)

  • Tkinter나 GTk+에서 사용하는 것과 같은 GUI 처리 이벤트 루프와 시그널 처리를 통합하는 것은 오랫동안 문제였습니다. 대부분의 소프트웨어는 매 순간 아주 짧은 시간마다 확인하여 GUI 이벤트가 발생했는지 체크하는 폴링 방식을 사용하게 됩니다. 이제 signal 모듈을 통해 이를 더 효율적으로 처리할 수 있습니다. signal.set_wakeup_fd(fd) 를 호출하면 사용할 파일 기술자가 설정되며, 시그널이 수신되면 해당 파일 기술자에 바이트 하나가 기록됩니다. 또한 디스크립터를 설정하기 위한 C 레벨 함수인 PySignal_SetWakeupFd() 도 제공됩니다.

    Event loops will use this by opening a pipe to create two descriptors, one for reading and one for writing. The writable descriptor will be passed to set_wakeup_fd(), and the readable descriptor will be added to the list of descriptors monitored by the event loop via select() or poll(). On receiving a signal, a byte will be written and the main event loop will be woken up, avoiding the need to poll.

    (Adam Olsen이 기여했습니다; bpo-1583.)

    siginterrupt() 함수를 이제 파이썬 코드에서 사용할 수 있으며, 시그널이 시스템 호출을 중단할 수 있는지 여부를 변경할 수 있습니다. (Ralf Schmitt가 기여했습니다.)

    setitimer()getitimer() 함수도 추가되었습니다(사용 가능한 환경에서). setitimer`는 지정된 시간(벽시계 시간, 소모된 프로세스 시간 또는 프로세스와 시스템의 합산 시간으로 측정) 후에 시그널을 전달하도록 인터벌 타이머를 설정할 있게 해줍니다. (Guilherme Polo가 기여했습니다; :issue:`2240().)

  • smtplib 모듈은 SMTP_SSL 클래스가 추가됨에 따라 SSL 기반의 SMTP를 지원합니다. 이 클래스는 기존 SMTP 클래스와 동일한 인터페이스를 지원합니다. (Monty Taylor 기여) 또한 두 클래스의 생성자 모두 초기 연결 시도에 대한 시간 제한을 초 단위로 지정하는 선택적 timeout 매개 변수를 가집니다. (Facundo Batista 기여)

    LMTP 프로토콜(RFC 2033) 구현도 모듈에 추가되었습니다. LMTP는 메일 큐를 관리하지 않는 에이전트 간에 이메일을 전달할 때 SMTP 대신 사용됩니다. (Leif Hedstrom에 의해 LMTP 구현; bpo-957003.)

    SMTP.starttls`는 이제 :rfc:`3207`을 준수하며, TLS 협상 자체에서 얻은 정보가 아닌 서버로부터 얻은 모든 정보를 무시합니다. (Bill Fenner에 의해 패치 제공; :issue:`829951().)

  • socket 모듈은 이제 클러스터링 환경에서 사용하도록 설계된 고성능 비(非)-IP 기반 프로토콜인 TIPC(https://tipc.sourceforge.net/)를 지원합니다. TIPC 주소는 4 또는 5개의 요소로 구성된 튜플입니다. (Alberto Bertogli 기여; bpo-1646.)

    새로운 함수인 create_connection() 은 주소를 입력받아 선택적 시간 제한 값을 사용하여 연결하고 연결된 소켓 객체를 반환합니다. 이 함수는 또한 주소의 유형을 조회하여 적절하게 IPv4 또는 IPv6를 사용하여 연결합니다. 코드를 socket(socket.AF_INET, ...) 대신 create_connection() 을 사용하도록 변경하는 것만으로도 코드가 IPv6에서 작동하게 만들 수 있습니다.

  • SocketServer 모듈의 기본 클래스들은 이제 서버의 timeout 속성에 정의된 비활성 기간이 지난 후 handle_timeout() 메서드를 호출하는 것을 지원합니다. (Michael Pomraning 기여) serve_forever() 메서드는 이제 서버가 종료 요청을 확인하는 빈도를 제어하는 초 단위의 선택적 폴링 간격을 인자로 받습니다. (Pedro Werneck 및 Jeffrey Yasskin 기여; bpo-742598, bpo-1193577.)

  • Gerhard Häring이 유지 관리하는 sqlite3 모듈이 파이썬 2.5의 버전 2.3.2에서 버전 2.4.1로 업데이트되었습니다.

  • struct 모듈은 이제 형식 문자 '?' 를 사용하여 C99 _Bool 유형을 지원합니다. (David Remahl 기여)

  • subprocess 모듈에서 제공하는 Popen 객체는 이제 terminate(), kill(), 그리고 send_signal() 메서드를 가집니다. Windows에서 send_signal()SIGTERM 신호만 지원하며, 이 모든 메서드는 Win32 API 함수인 TerminateProcess() 의 별칭입니다. (Christian Heimes 기여)

  • sys 모듈의 새 변수인 float_info 는 플랫폼의 부동 소수점 지원에 대해 float.h 파일에서 파생된 정보를 포함하는 객체입니다. 이 객체의 속성에는 mant_dig (가수 부분의 자릿수), epsilon (1.0과 그보다 큰 다음 표현 가능한 값 사이의 가장 작은 차이) 등이 포함됩니다. (Christian Heimes 기여; bpo-1534.)

    또 다른 새 변수인 dont_write_bytecode`는 모듈을 임포트할 파이썬이 :file:.pyc` 또는 .pyo 파일을 작성하는지 여부를 제어합니다. 이 변수가 참이면 컴파일된 파일이 작성되지 않습니다. 이 변수는 파이썬 인터프리터에 -B 스위치를 전달하거나, 인터프리터를 실행하기 전에 PYTHONDONTWRITEBYTECODE 환경 변수를 설정하여 시작 시에 초기화됩니다. 그 후 파이썬 코드를 통해 이 변수의 값을 변경하여 바이트코드 파일의 작성 여부를 제어할 수 있습니다. (Neal Norwitz 및 Georg Brandl 기여)

    파이썬 인터프리터에 제공된 명령행 인수에 대한 정보는 sys.flags 로 사용 가능한 네임드 튜플의 속성을 읽어 확인할 수 있습니다. 예를 들어, verbose 속성은 파이썬이 verbose 모드로 실행된 경우 참이며, debug 는 디버깅 모드인 경우 참입니다. 이 속성들은 모두 읽기 전용입니다. (Christian Heimes 기여)

    새로운 함수인 getsizeof() 는 파이썬 객체를 받아 해당 객체가 사용하는 메모리 양을 바이트 단위로 반환합니다. 내장 객체는 정확한 결과를 반환하며, 타사 확장 모듈은 그렇지 않을 수 있으나 객체의 크기를 반환하는 __sizeof__() 메서드를 정의할 수 있습니다. (Robert Schuppenies 기여; bpo-2898.)

    sys.getprofile()sys.gettrace`를 호출하여 현재 프로파일러 추적기 함수를 파악할 있습니다. (Georg Brandl 기여; :issue:`1648().)

  • tarfile 모듈은 기존에 지원되던 POSIX.1-1988(ustar) 및 GNU tar 형식 외에도 이제는 POSIX.1-2001(pax) tar 파일을 지원합니다. 기본 형식은 GNU tar이며, 다른 형식을 사용하여 파일을 열려면 format 매개 변수를 지정하십시오:

    tar = tarfile.open("output.tar", "w",
                       format=tarfile.PAX_FORMAT)
    

    새로운 encodingerrors 매개 변수는 문자 변환을 위한 인코딩과 오류 처리 방식을 지정합니다. 'strict', 'ignore', 'replace' 는 파이썬에서 오류를 처리하는 세 가지 표준 방식이며, 'utf-8' 은 문제가 있는 문자를 UTF-8 표현으로 대체하는 특별한 값입니다. (PAX 형식이 유니코드 파일 이름을 지원하므로 문자 변환이 발생하며, 기본값은 UTF-8 인코딩입니다.)

    TarFile.add() 메서드는 이제 아카이브에서 특정 파일명을 제외하는 데 사용할 수 있는 함수인 exclude 인수를 허용합니다. 이 함수는 파일 이름을 입력받아 해당 파일을 제외해야 하는 경우 True를, 포함해야 하는 경우 False를 반환해야 합니다. 이 함수는 add() 에 처음 전달된 이름과 재귀적으로 추가된 디렉터리에 있는 파일들의 이름 모두에 적용됩니다.

    (모든 변경 사항은 Lars Gustäbel이 기여했습니다.)

  • telnetlib.Telnet 클래스 생성자에 초 단위의 시간 제한을 지정하는 선택적 timeout 매개 변수가 추가되었습니다. (Facundo Batista 추가)

  • tempfile.NamedTemporaryFile 클래스는 일반적으로 파일이 닫힐 때 생성한 임시 파일을 삭제합니다. 이제는 생성자에 delete=False 를 전달하여 이 동작을 변경할 수 있습니다. (Damien Miller 기여; bpo-1537850.)

    새로운 클래스인 SpooledTemporaryFile 은 임시 파일처럼 작동하지만 최대 크기를 초과할 때까지 데이터를 메모리에 저장합니다. 해당 제한에 도달하면 내용이 디스크의 임시 파일에 기록됩니다. (Dustin J. Mitchell 기여)

    NamedTemporaryFileSpooledTemporaryFile 클래스 모두 컨텍스트 매니저로 작동하므로 with tempfile.NamedTemporaryFile() as tmp: ... 와 같이 작성할 수 있습니다. (Alexander Belopolsky 기여; bpo-2021.)

  • test.test_support 모듈에 테스트 작성을 위한 여러 컨텍스트 매니저가 추가되었습니다. EnvironmentVarGuard() 은 환경 변수를 일시적으로 변경하고 자동으로 이전 값으로 복원하는 컨텍스트 매니저입니다.

    또 다른 컨텍스트 매니저인 TransientResource 는 사용 가능 여부가 불확실한 리소스 호출을 감싸며, 지정된 일련의 예외를 포착하고 무시합니다. 예를 들어, 네트워크 테스트에서 외부 웹 사이트에 연결할 때 발생하는 특정 오류들을 무시하도록 설정할 수 있습니다:

    with test_support.TransientResource(IOError,
                                    errno=errno.ETIMEDOUT):
        f = urllib.urlopen('https://sf.net')
        ...
    

    마지막으로, check_warnings()warning 모듈의 경고 필터를 재설정하고 발생한 모든 경고 메시지를 기록하는 객체를 반환합니다(bpo-3781):

    with test_support.check_warnings() as wrec:
        warnings.simplefilter("always")
        # ... 경고를 유발하는 코드 ...
        assert str(wrec.message) == "function is outdated"
        assert len(wrec.warnings) == 1, "Multiple warnings raised"
    

    (Brett Cannon이 기여했습니다.)

  • textwrap 모듈은 이제 인자로 drop_whitespace=False 를 지정하여 새롭게 생성된 줄의 시작과 끝에 있는 기존 공백을 유지할 수 있습니다:

    >>> S = """This  sentence  has a bunch   of
    ...   extra   whitespace."""
    >>> print textwrap.fill(S, width=15)
    This  sentence
    has a bunch
    of    extra
    whitespace.
    >>> print textwrap.fill(S, drop_whitespace=False, width=15)
    This  sentence
      has a bunch
       of    extra
       whitespace.
    >>>
    

    (Dwayne Bailey 기여; bpo-1581073.)

  • threading 모듈 API가 setDaemon()isDaemon() 메서드 대신 daemon 과 같은 속성을 사용하도록 변경되며, 일부 메서드는 카멜 케이스 대신 언더스코어를 사용하도록 이름이 변경됩니다. 예를 들어, activeCount() 메서드는 active_count() 로 변경되었습니다. 모듈의 2.6 및 3.0 버전 모두 동일한 속성과 변경된 메서드를 지원하지만 기존 메서드를 제거하지는 않습니다. 파이썬 3.x에서 기존 API를 폐지할 날짜는 아직 정해지지 않았으며, 2.x 버전에서는 어떤 경우에도 이전 API가 삭제되지 않습니다. (여러 사람에 의해 수행되었으며, 특히 Benjamin Peterson의 기여가 컸습니다.)

    threading 모듈의 Thread 객체에 스레드 식별자(0이 아닌 정수)를 반환하는 ident 속성이 추가되었습니다. (Gregory P. Smith 기여; bpo-2871.)

  • timeit 모듈은 이제 측정할 문장과 설정 코드에 문자열뿐만 아니라 호출 가능한 객체(callable)도 허용합니다. Timer 인스턴스를 생성하기 위한 두 개의 편의 함수가 추가되었습니다: repeat(stmt, setup, time, repeat, number)timeit(stmt, setup, time, number) 는 인스턴스를 생성하고 해당 메서드를 호출합니다. (Erik Demaine 기여; bpo-1533909.)

  • Tkinter 모듈은 이제 옵션으로 리스트와 튜플을 수용하며, 결과를 Tcl/Tk에 전달하기 전에 요소들을 공백으로 구분합니다. (Guilherme Polo 기여; bpo-2906.)

  • 터틀 그래픽을 위한 turtle 모듈이 Gregor Lingl에 의해 크게 개선되었습니다. 추가된 기능은 다음과 같습니다:

    • 거북이 움직임 및 회전에 대한 더 나은 애니메이션 구현.

    • delay(), tracer(), 그리고 speed() 메서드를 사용하여 거북이 움직임을 제어할 수 있는 기능.

    • 거북이를 위한 새로운 모양 설정 및 새로운 좌표계 정의 기능.

    • 터틀이 동작을 되돌릴 수 있는 undo() 메서드를 가집니다.

    • 마우스 및 키보드 활동과 같은 입력 이벤트에 반응하는 기본 지원이 추가되어 간단한 게임을 작성할 수 있습니다.

    • turtle.cfg 파일을 사용하여 터틀 화면의 시작 외관을 사용자 정의할 수 있습니다.

    • 모듈의 독스트링을 다른 언어로 번역된 새로운 독스트링으로 교체할 수 있습니다.

    (bpo-1513695)

  • urllib.urlopen 함수와 urllib.ftpwrapper 클래스 생성자, 그리고 urllib2.urlopen 함수에 선택적 timeout 매개 변수가 추가되었습니다. 이 매개 변수는 초 단위의 시간 제한을 지정합니다. 예를 들면:

    >>> u = urllib2.urlopen("http://slow.example.com",
                            timeout=3)
    Traceback (most recent call last):
      ...
    urllib2.URLError: <urlopen error timed out>
    >>>
    

    (Facundo Batista 추가)

  • unicodedata 모듈에서 제공하는 유니코드 데이터베이스가 버전 5.1.0으로 업데이트되었습니다. (Martin von Löwis에 의해 업데이트됨; bpo-3811.)

  • warnings 모듈의 formatwarning()showwarning() 에 소스 코드의 줄 번호를 제공하는 데 사용할 수 있는 선택적 line 인자가 추가되었습니다. (C 코드로 warnings 모듈의 일부를 재구현한 bpo-1631171 의 일부로 추가됨.)

    catch_warnings`는 테스트 목적을 위해 설계된 컨텍스트 관리자로, 경고 필터를 일시적으로 수정한 원래 값으로 복구할 있게 해줍니다. (:issue:`3781().)

  • XML-RPC의 SimpleXMLRPCServerDocXMLRPCServer 클래스는 생성자 매개변수 bind_and_activateFalse 를 전달함으로써 소켓을 즉시 열고 바인딩하는 것을 방지할 수 있습니다. 이는 소켓을 열고 연결 대기를 시작하기 위해 server_bind()server_activate() 메서드를 호출하기 전에 인스턴스의 allow_reuse_address 속성을 수정하는 데 사용할 수 있습니다. (Peter Parente가 기여; bpo-1599845.)

    SimpleXMLRPCServer_send_traceback_header 속성도 포함하고 있습니다. 이 값이 참이면 예외 및 형식화된 트레이스백이 “X-Exception” 및 “X-Traceback” HTTP 헤더로 반환됩니다. 이 기능은 디버깅 목적의 전용이며, 트레이스백이 비밀번호나 기타 민감한 정보를 노출할 수 있으므로 운영 서버에서는 사용해서는 안 됩니다. (Alan McIntyre가 Google Summer of Code 2007 프로젝트의 일부로 기여함.)

  • xmlrpclib 모듈은 더 이상 datetime.datedatetime.time 을 다음의 xmlrpclib.DateTime 타입으로 자동 변환하지 않습니다; 이 변환 의미론은 모든 애플리케이션에 대해 반드시 정확한 것은 아닙니다. xmlrpclib 를 사용하는 코드는 datetime 인스턴스를 변환해야 합니다. (bpo-1330538) 또한 이 코드는 1900년 이전의 날짜 기능도 처리할 수 있으며 (Ralf Schmitt 기여; bpo-2014), XML-RPC 응답에서 <i8> 를 사용하여 표현된 64비트 정수도 처리합니다 (Riku Lindblad 기여; bpo-2985).

  • zipfile 모듈의 ZipFile 클래스에 현재 디렉토리 또는 지정된 디렉토리로 단일 파일이나 아카이브 내 모든 파일을 압축 해제하는 extract()extractall() 메서드가 추가되었습니다:

    z = zipfile.ZipFile('python-251.zip')
    
    # 단일 파일을 압축 해제하여 /tmp 디렉토리에
    # 상대 경로로 기록합니다.
    z.extract('Python/sysmodule.c', '/tmp')
    
    # 아카이브 내의 모든 파일을 압축 해제합니다.
    z.extractall()
    

    (Alan McIntyre 기여; bpo-467924.)

    open(), read()extract() 메서드가 이제 파일명 또는 ZipInfo 객체를 모두 받아올 수 있습니다. 이는 아카이브에 실수로 중복된 파일명이 포함되어 있을 때 유용합니다. (Graham Horler 기여; bpo-1775025.)

    마지막으로, zipfile`이 이제 아카이브된 파일에 대해 유니코드 파일 이름을 사용하는 것을 지원합니다. (Alexey Borzenkov 기여; :issue:`1734346.)

ast 모듈

ast 모듈은 파이썬 코드의 추상 구문 트리(AST) 표현을 제공하며, Armin Ronacher는 다양한 일반적인 작업을 수행하는 일련의 헬퍼 함수들을 기여했습니다. 이 기능들은 HTML 템플릿 패키지, 코드 분석기 및 파이썬 코드를 처리하는 유사한 도구들에 유용하게 쓰일 것입니다.

parse() 함수는 표현식을 받아 AST를 반환합니다. dump() 함수는 디버깅에 적합한 트리 형태의 표현을 출력합니다:

import ast

t = ast.parse("""
d = {}
for i in 'abcdefghijklm':
    d[i + i] = ord(i) - ord('a') + 1
print d
""")
print ast.dump(t)

이 함수는 깊게 중첩된 트리를 출력합니다:

Module(body=[
  Assign(targets=[
    Name(id='d', ctx=Store())
   ], value=Dict(keys=[], values=[]))
  For(target=Name(id='i', ctx=Store()),
      iter=Str(s='abcdefghijklm'), body=[
    Assign(targets=[
      Subscript(value=
        Name(id='d', ctx=Load()),
          slice=
          Index(value=
            BinOp(left=Name(id='i', ctx=Load()), op=Add(),
             right=Name(id='i', ctx=Load()))), ctx=Store())
     ], value=
     BinOp(left=
      BinOp(left=
       Call(func=
        Name(id='ord', ctx=Load()), args=[
          Name(id='i', ctx=Load())
         ], keywords=[], starargs=None, kwargs=None),
       op=Sub(), right=Call(func=
        Name(id='ord', ctx=Load()), args=[
          Str(s='a')
         ], keywords=[], starargs=None, kwargs=None)),
       op=Add(), right=Num(n=1)))
    ], orelse=[])
   Print(dest=None, values=[
     Name(id='d', ctx=Load())
   ], nl=True)
 ])

literal_eval() 메서드는 문자열 또는 리터럴 표현을 나타내는 AST를 입력받아 파싱 및 평가하고 결과 값을 반환합니다. 리터럴 표현은 문구(statement)나 함수 호출 없이 오직 문자열, 숫자, 딕셔너리 등만을 포함하는 파이썬 표현식입니다. 표현식을 평가해야 하지만 eval() 호출의 보안 위험을 감수할 수 없는 경우, literal_eval() 을 통해 안전하게 처리할 수 있습니다:

>>> literal = '("a", "b", {2:4, 3:8, 1:2})'
>>> print ast.literal_eval(literal)
('a', 'b', {1: 2, 2: 4, 3: 8})
>>> print ast.literal_eval('"a" + "b"')
Traceback (most recent call last):
  ...
ValueError: malformed string

또한 이 모듈에는 AST를 순회하고 수정하기 위한 NodeVisitorNodeTransformer 클래스와 줄 번호를 변경하는 것과 같은 일반적인 변환을 위한 함수들이 포함되어 있습니다.

future_builtins 모듈

Python 3.0은 내장 함수 목록에 많은 변화를 가하는데, 대부분의 변경 사항은 호환성을 깨뜨릴 수 있기 때문에 Python 2.x 시리즈에서는 도입할 수 없습니다. future_builtins 모듈은 3.0과 호환되는 코드를 작성할 때 임포트하여 사용할 수 있는 이러한 내장 함수들의 버전을 제공합니다.

이 모듈의 기능은 현재 다음을 포함합니다:

  • ascii(obj): repr() 과 동일합니다. Python 3.0에서 repr() 은 유니코드 문자열을 반환하는 반면, ascii() 는 순수 ASCII 바이트 문자열을 반환합니다.

  • filter(predicate, iterable), map(func, iterable1, ...): 3.0 버전은 리스트를 반환하는 2.x 내장 함수와 달리 이터레이터를 반환합니다.

  • hex(value), oct(value): 이 버전들은 __hex__() 또는 __oct__() 메서드를 호출하는 대신, __index__() 메서드를 호출하고 결과를 16진수나 8진수로 변환합니다. oct`는 결과에 새로운 ``0o`() 표기법을 사용합니다.

json 모듈: JavaScript Object Notation

새로운 json 모듈은 파이썬 유형을 JSON(JavaScript Object Notation)으로 인코딩하고 디코딩하는 것을 지원합니다. JSON은 웹 애플리케이션에서 자주 사용되는 가벼운 데이터 교환 형식입니다. JSON에 대한 자세한 정보는 http://www.json.org를 참조하십시오.

json 은 대부분의 파이썬 내장 유형을 인코딩하고 디코딩하는 기능을 지원합니다. 다음 예제는 딕셔너리를 인코딩하고 디코딩합니다:

>>> import json
>>> data = {"spam": "foo", "parrot": 42}
>>> in_json = json.dumps(data) # 데이터 인코딩
>>> in_json
'{"parrot": 42, "spam": "foo"}'
>>> json.loads(in_json) # 파이썬 객체로 디코딩
{"spam": "foo", "parrot": 42}

더 많은 유형을 지원하기 위해 직접 디코더와 인코더를 작성하는 것도 가능합니다. 또한 JSON 문자열의 예쁘게 출력(Pretty-printing)도 지원됩니다.

json (원래 이름은 simplejson)은 Bob Ippolito가 작성했습니다.

plistlib 모듈: 프로퍼티 리스트 파서

.plist 형식은 기본 데이터 유형(숫자, 문자열, 리스트, 딕셔너리)을 XML 기반 형식으로 직렬화하여 저장하기 위해 Mac OS X에서 흔히 사용됩니다. 이는 데이터 유형의 XML-RPC 직렬화와 유사합니다.

주로 Mac OS X에서 사용됨에도 불구하고 이 형식은 특정 Mac 전용 기능이 없으며, 파이썬 구현체는 파이썬이 지원하는 모든 플랫폼에서 작동합니다. 따라서 plistlib 모듈은 표준 라이브러리로 승격되었습니다.

모듈 사용법은 간단합니다:

import sys
import plistlib
import datetime as dt

# 데이터 구조 생성
data_struct = dict(lastAccessed=dt.datetime.now(),
                   version=1,
                   categories=('Personal','Shared','Private'))

# XML을 포함하는 문자열 생성.
plist_str = plistlib.writePlistToString(data_struct)
new_struct = plistlib.readPlistFromString(plist_str)
print data_struct
print new_struct

# 데이터 구조를 파일에 쓰고 다시 읽어오기.
plistlib.writePlist(data_struct, '/tmp/customizations.plist')
new_struct = plistlib.readPlist('/tmp/customizations.plist')

# read/writePlist는 경로뿐만 아니라 파일과 같은 객체도 수용합니다.
plistlib.writePlist(data_struct, sys.stdout)

ctypes 개선 사항

Thomas Heller가 ctypes 모듈을 계속 관리하고 개선해 나갔습니다.

ctypes`는 이제 C99 ``bool` 타입을 나타내는 c_bool 데이터 유형을 지원합니다. (David Remahl 기여; bpo-1649190.)

ctypes 의 문자열, 버퍼 및 배열 유형이 (start, stop, step) 의 다양한 조합을 제공하는 확장 슬라이싱 구문에 대한 지원을 개선했습니다. (Thomas Wouters 구현.)

모든 ctypes 데이터 유형이 제공된 버퍼 객체를 기반으로 ctypes 인스턴스를 생성하는 from_buffer()from_buffer_copy() 메서드를 지원합니다. from_buffer_copy() 는 객체의 내용을 복사하고, from_buffer() 는 동일한 메모리 영역을 공유합니다.

새로운 호출 규약이 래핑된 각 호출의 시작 부분에서 ctypes`가 ``errno` 또는 Win32 LastError 변수를 삭제하도록 지시합니다. (Thomas Heller 구현; bpo-1798.)

이제 함수 호출 후 유닉스 errno 변수를 가져올 수 있습니다. 래핑된 함수를 생성할 때, DLL() 함수에 키워드 매개변수로 use_errno=True 를 전달하고 모듈 수준 메서드인 set_errno()get_errno() 를 호출하여 에러 값을 설정하고 가져올 수 있습니다.

Win32 LastError 변수도 DLL(), OleDLL(), 및 WinDLL() 함수에서 유사하게 지원됩니다. 키워드 매개변수로 use_last_error=True 를 전달하고 모듈 수준 메서드인 set_last_error()get_last_error() 를 호출하면 됩니다.

ctypes 인스턴스의 포인터를 가져오는 데 사용되는 byref() 함수에 이제 선택적 offset 매개변수가 추가되었습니다. 이는 반환된 포인터에 더해질 바이트 수입니다.

향상된 SSL 지원

Bill Janssen는 OpenSSL 라이브러리 기반의 새로운 모듈인 ssl 을 추가함으로써 파이썬 2.6의 Secure Sockets Layer 지원을 대폭 개선했습니다. 이 새 모듈은 협상된 프로토콜, 사용되는 X.509 인증서에 대한 더 많은 제어 기능을 제공하며, 파이썬에서 SSL 서버(클라이언트가 아닌)를 작성할 때 더 나은 지원을 제공합니다. socket 모듈의 기존 SSL 지원은 제거되지 않았으며 계속 작동하지만, 파이썬 3.0에서는 제거될 예정입니다.

새 모듈을 사용하려면 먼저 일반적인 방식으로 TCP 연결을 생성한 다음 이를 ssl.wrap_socket() 함수에 전달해야 합니다. 인증서 필요 여부를 지정할 수 있으며, getpeercert() 메서드를 호출하여 인증서 정보를 얻을 수도 있습니다.

더 보기

ssl 모듈의 문서.

폐지 및 제거

  • String 예외가 제거되었습니다. 이를 사용하려고 시도하면 TypeError 가 발생합니다.

  • PEP 352 에 따른 Exception 인터페이스 변경이 계속 진행 중입니다. 2.6 버전에서는 message 속성을 args 속성으로 대체하면서 폐지합니다.

  • (3.0 경고 모드) 파이썬 3.0은 구조화된 표준 라이브러리를 특징으로 하며, 이 과정에서 많은 오래된 모듈을 삭제하고 다른 모듈의 이름을 변경합니다. 3.0-경고 모드에서 실행되는 파이썬 2.6은 해당 모듈들을 임포트할 때 경고를 표시합니다.

    폐지된 모듈 목록은 다음과 같습니다: audiodev, bgenlocations, buildtools, bundlebuilder, Canvas, compiler, dircache, dl, fpformat, gensuitemodule, ihooks, imageop, imgfile, linuxaudiodev, mhlib, mimetools, multifile, new, pure, statvfs, sunaudiodev, test.testall, 그리고 toaiff.

  • gopherlib 모듈이 제거되었습니다.

  • MimeWriter 모듈과 mimify 모듈이 폐지되었습니다. 대신 email 패키지를 사용하십시오.

  • md5 모듈이 폐지되었으므로 대신 hashlib 모듈을 사용하십시오.

  • The posixfile module has been deprecated; fcntl.lockf() provides better locking.

  • popen2 모듈이 폐지되었으므로 subprocess 모듈을 사용하십시오.

  • rgbimg 모듈이 제거되었습니다.

  • sets 모듈이 폐지되었으므로 내장된 setfrozenset 타입을 사용하는 것이 더 좋습니다.

  • sha 모듈이 폐지되었으므로 대신 hashlib 모듈을 사용하십시오.

빌드 및 C API 변경 사항

Python 빌드 프로세스 및 C API의 변경 사항은 다음과 같습니다:

  • Python은 이제 C89 컴파일러(19년 만에!)로 컴파일되어야 합니다. 이는 파이썬 소스 트리가 C89 표준 라이브러리에 포함된 memmove`와 :c:func:()!strerror` 자체 구현을 제거했다는 것을 의미합니다.

  • 파이썬 2.6은 Microsoft Visual Studio 2008(버전 9.0)로 빌드할 수 있으며, 이는 새로운 기본 컴파일러입니다. 빌드 파일은 :file:`PCbuild` 디렉터리를 참조하십시오. (Christian Heimes가 구현했습니다.)

  • Mac OS X에서 Python 2.6은 4방향 유니버설 빌드로 컴파일될 수 있습니다. :program:configure 스크립트는 --with-universal-archs=[32-bit|64-bit|all] 전환기를 받아, 바이너리가 32비트 아키텍처(x86, PowerPC), 64비트(x86-64 및 PPC-64) 또는 둘 모두를 위해 빌드되는지 제어할 수 있습니다. (Ronald Oussoren 기여.)

  • Python 2.6.6에 추가된 새 함수인 PySys_SetArgvEx()sys.argv 의 값을 설정하고, updatepath 매개변수의 값에 따라 선택적으로 스크립트가 있는 디렉토리를 포함하도록 sys.path 를 업데이트할 수 있습니다.

    This function was added to close a security hole for applications that embed Python. The old function, PySys_SetArgv(), would always update sys.path, and sometimes it would add the current directory. This meant that, if you ran an application embedding Python in a directory controlled by someone else, attackers could put a Trojan-horse module in the directory (say, a file named os.py) that your application would then import and run.

    Python을 임베드하는 C/C++ 애플리케이션을 유지 관리한다면, PySys_SetArgv`를 호출하고 있는지 확인하고, 애플리케이션이 *updatepath*를 false로 설정하여 :c:func:()!PySys_SetArgvEx`를 사용해야 하는지 신중하게 고려하십시오. 이 함수를 사용하는 것은 Python 2.6.5 이전 버전과의 호환성을 깨뜨린다는 점에 유의하십시오. 이전 버전을 계속 사용해야 한다면, PySys_SetArgv() 호출은 그대로 두고 나중에 PyRun_SimpleString("sys.path.pop(0)\n")``를 호출하여 번째 ``sys.path 구성 요소를 제거할 수 있습니다.

    CVE 2008-5983 로 보고된 보안 이슈이며, gh-50003 에서 논의되었고 Antoine Pitrou에 의해 수정되었습니다.

  • BerkeleyDB 모듈은 이제 bsddb.db.api 로 사용 가능한 C API 객체를 갖게 됩니다. 이 객체는 자신의 목적을 위해 bsddb 모듈을 사용하려는 다른 C 확장 프로그램에서 사용할 수 있습니다. (Duncan Grisby 기여.)

  • The new buffer interface, previously described in the PEP 3118 section, adds PyObject_GetBuffer() and PyBuffer_Release(), as well as a few other functions.

  • Python’s use of the C stdio library is now thread-safe, or at least as thread-safe as the underlying library is. A long-standing potential bug occurred if one thread closed a file object while another thread was reading from or writing to the object. In 2.6 file objects have a reference count, manipulated by the PyFile_IncUseCount() and PyFile_DecUseCount() functions. File objects can’t be closed unless the reference count is zero. PyFile_IncUseCount() should be called while the GIL is still held, before carrying out an I/O operation using the FILE * pointer, and PyFile_DecUseCount() should be called immediately after the GIL is re-acquired. (Contributed by Antoine Pitrou and Gregory P. Smith.)

  • 두 개의 다른 스레드에서 모듈을 동시에 임포트하는 것이 더 이상 데드락을 유발하지 않습니다. 이제 ImportError 를 발생시킵니다. 새로운 API 함수인 PyImport_ImportModuleNoBlock() 은 먼저 sys.modules 에서 모듈을 찾은 다음, 임포트 잠금을 획득한 후 임포트를 시도하게 됩니다. 임포트 잠금이 다른 스레드에 의해 보유된 경우, ImportError 가 발생합니다. (Christian Heimes 기여.)

  • 여러 함수는 플랫폼의 부동 소수점 지원에 대한 정보를 반환합니다. PyFloat_GetMax() 는 표현 가능한 최대 부동 소수점 값을, 그리고 PyFloat_GetMin() 은 최소 양수 값을 반환합니다. PyFloat_GetInfo()float.h 파일에서 "mant_dig" (가수의 자릿수), "epsilon" (1.0과 다음에 표현 가능한 가장 큰 값 사이의 가장 작은 차이) 등 더 많은 정보를 담고 있는 객체를 반환합니다. (Christian Heimes 기여; bpo-1534.)

  • PyComplex_AsCComplex() 를 사용하는 C 함수 및 메서드는 이제 __complex__() 메서드를 갖는 인수를 허용합니다. 특히, cmath 모듈의 함수들은 이 메서드를 가진 객체를 허용하게 됩니다. 이것은 Python 3.0 변경 사항의 백포트입니다. (Mark Dickinson 기여; bpo-1675423.)

  • 파이썬 C API에 이제 대소 문자 구분 없는 문자열 비교를 위한 두 함수인 PyOS_stricmp(char*, char*)PyOS_strnicmp(char*, char*, Py_ssize_t) 가 포함됩니다. (Christian Heimes가 기여했습니다; bpo-1635.)

  • Many C extensions define their own little macro for adding integers and strings to the module’s dictionary in the init* function. Python 2.6 finally defines standard macros for adding values to a module, PyModule_AddStringMacro and PyModule_AddIntMacro(). (Contributed by Christian Heimes.)

  • 몇 가지 매크로는 3.0 및 2.6 모두에서 함수가 아니라 매크로임을 명확히 하기 위해 이름이 변경되었습니다. Py_Size()Py_SIZE() 가 되었고, Py_Type()Py_TYPE() 이 되었으며, Py_Refcnt()Py_REFCNT() 가 되었습니다. 혼합 케이스 매크로는 여전히 이전 버전 호환성을 위해 Python 2.6에서 사용할 수 있습니다. (bpo-1629)

  • 이제 Distutils는 파이썬 디버그 버전에서 실행될 때 구축하는 C 확장 모듈을 다른 디렉터리에 배치합니다. (Collin Winter가 기여했습니다; bpo-1530959.)

  • 정수 및 문자열과 같은 여러 기본 데이터 유형은 재사용 가능한 객체들의 내부 자유 목록(free lists)을 유지합니다. 이제 이 자유 목록을 위한 데이터 구조는 명명 규칙을 따릅니다. 변수는 항상 free_list 로 이름이 지정되고, 카운터는 항상 numfree 로 이름이 지정되며, ``Py<typename>_MAXFREELIST`` 매크로가 항상 정의됩니다.

  • 새로운 Makefile 타겟인 “make patchcheck”는 패치 생성을 위해 파이썬 소스 트리를 준비합니다. 모든 수정된 .py 파일의 뒤쪽 공백을 수정하고, 문서가 변경되었는지 확인하며, :file:`Misc/ACKS`:file:`Misc/NEWS` 파일이 업데이트되었는지 보고합니다. (Brett Cannon이 기여했습니다.)

    또 다른 새로운 타겟인 “make profile-opt”는 GCC의 프로파일 기반 최적화(profile-guided optimization)를 사용하여 파이썬 바이너리를 컴파일합니다. 이 기능은 프로파일링을 활성화하여 파이썬을 컴파일하고, 테스트 스위트를 실행하여 일련의 프로파일링 결과를 얻은 다음, 이 결과들을 사용하여 최적화를 위해 다시 빌드합니다. (Gregory P. Smith가 기여했습니다.)

포트별 변경 사항: Windows

  • Windows 95, 98, ME 및 NT4 지원이 중단되었습니다. 파이썬 2.6은 최소 Windows 2000 SP4를 요구합니다.

  • 윈도우의 새로운 기본 컴파일러는 Visual Studio 2008(버전 9.0)입니다. Visual Studio 2003(버전 7.1) 및 2005(버전 8.0)용 빌드 디렉터리는 PC/ 디렉터리로 이동되었습니다. 새로운 :file:`PCbuild` 디렉터리는 X64를 위한 교차 컴파일, 디버그 빌드 및 프로파일 기반 최적화(PGO)를 지원합니다. PGO 빌드는 일반 빌드보다 약 10% 더 빠릅니다. (Christian Heimes가 Amaury Forgeot d’Arc와 Martin von Löwis의 도움으로 구현했습니다.)

  • msvcrt 모듈은 이제 콘솔 I/O API의 일반 문자 및 광폭 문자 변형을 모두 지원합니다. getwch() 함수는 키 입력을 읽고 Unicode 값을 반환하며, 이는 getwche() 함수와 같습니다. putwch() 함수는 Unicode 문자를 받아 콘솔에 씁니다. (Christian Heimes 기여.)

  • os.path.expandvars`는 이제 "%var%" 형태의 환경 변수를 확장하며, "~user"는 사용자의 디렉터리 경로로 확장됩니다. (Josiah Carlson 기여; :issue:`957650().)

  • socket 모듈의 소켓 객체들은 이제 제한된 인터페이스를 제공하는 ioctl() 메서드를 가지고 있으며, 이는 WSAIoctl() 시스템 인터페이스에 대한 기능입니다.

  • _winreg 모듈은 이제 입력 문자열의 %NAME% 와 같은 환경 변수 참조를 확장하는 ExpandEnvironmentStrings() 함수를 가지고 있습니다. 또한, 이 모듈에서 제공하는 핸들 객체들은 컨텍스트 프로토콜을 지원하게 되어 with 문에서 사용될 수 있습니다. (Christian Heimes 기여.)

    _winreg also has better support for x64 systems, exposing the DisableReflectionKey(), EnableReflectionKey(), and QueryReflectionKey() functions, which enable and disable registry reflection for 32-bit processes running on 64-bit systems. (bpo-1753245)

  • msilib 모듈의 Record 객체는 필드 값을 정수 또는 문자열로 반환하는 GetInteger()GetString() 메서드를 추가했습니다. (Floris Bruynooghe 기여; bpo-2125.)

포트별 변경 사항: Mac OS X

  • Python의 프레임워크 빌드를 컴파일할 때, configure 스크립트에 --with-framework-name= 옵션을 제공하여 사용할 프레임워크 이름을 지정할 수 있습니다.

  • macfs 모듈이 제거되었습니다. 이는 또한 macfs 모듈에 의존했기 때문에 macostools.touched() 함수도 제거해야 했습니다. (bpo-1490190)

  • 많은 다른 Mac OS 모듈들이 폐지되었으며 Python 3.0에서 제거될 예정입니다: _builtinSuites, aepack, aetools, aetypes, applesingle, appletrawmain, appletrunner, argvemulator, Audio_mac, autoGIL, Carbon, cfmfile, CodeWarrior, ColorPicker, EasyDialogs, Explorer, Finder, FrameWork, findertools, ic, icglue, icopen, macerrors, MacOS, macfs, macostools, macresource, MiniAEFrame, Nav, Netscape, OSATerminology, pimp, PixMapWrapper, StdSuites, SystemEvents, Terminal, 그리고 terminalcommand.

포트 특정 변경 사항: IRIX

여러 오래된 IRIX 전용 모듈이 폐지되었으며 Python 3.0에서 제거될 예정입니다: alAL, cd, cddb, cdplayer, CLcl, DEVICE, ERRNO, FILE, FLfl, flp, fm, GET, GLWS, GLgl, IN, IOCTL, jpeg, panelparser, readcd, SVsv, torgb, videoreader, 그리고 WAIT.

Python 2.6으로 이식하기

이 섹션에서는 앞서 설명한 변경 사항과 코드 수정이 필요할 수 있는 기타 버그 수정을 나열합니다.

  • 해시 가능(hashable)하지 않은 클래스는 해당 사실을 나타내기 위해 정의에서 __hash__ = None 을 설정해야 합니다.

  • String 예외가 제거되었습니다. 이를 사용하려고 시도하면 TypeError 가 발생합니다.

  • collections.deque__init__() 메서드는 이제 이터러블(iterable)에서 요소를 추가하기 전에 데크의 기존 내용을 모두 삭제합니다. 이 변경을 통해 행동이 list.__init__() 와 일치하게 되었습니다.

  • object.__init__() 은 이전에는 임의의 인자와 키워드 인자를 허용하고 무시했습니다. Python 2.6에서는 더 이상 허용되지 않으며 TypeError 를 발생시킵니다. 이는 (아마도 super() 를 사용하여) 최종적으로 object 의 해당 메서드를 호출하는 __init__() 메서드에 영향을 미칩니다. 논의 내용은 bpo-1683368 을 참조하십시오.

  • Decimal 생성자는 이제 문자열이 전달될 때 앞뒤 공백을 허용합니다. 이전에는 InvalidOperation 예외를 발생시켰습니다. 반면에, Context 객체의 create_decimal() 메서드는 이제 추가적인 공백을 명시적으로 허용하지 않으며 ConversionSyntax 예외를 발생시킵니다.

  • 구현상의 실수로 인해 내장된 __import__() 함수에 파일 경로를 전달하면 실제로 해당 파일을 임포트하는 문제가 있었습니다. 이는 의도된 동작이 아니었으며, 현재 구현에서는 이 경우를 명시적으로 확인하고 ImportError 를 발생시킵니다.

  • C API: PyImport_Import()PyImport_ImportModule() 함수는 이제 상대 임포트가 아닌 절대 임포트를 기본값으로 합니다. 이는 다른 모듈을 임포트하는 C 확장 기능에 영향을 미칩니다.

  • C API: 해시 가능하지 않은 확장 데이터 형식은 tp_hash 슬롯을 PyObject_HashNotImplemented() 로 정의해야 합니다.

  • socket 모듈 예외인 socket.error 는 이제 IOError 를 상속받습니다. 이전에는 StandardError 의 하위 클래스가 아니었으나, 이제 IOError 를 통해 상속받게 됩니다. (Gregory P. Smith에 의해 구현됨; bpo-1706815.)

  • xmlrpclib 모듈은 더 이상 datetime.datedatetime.timexmlrpclib.DateTime 유형으로 자동 변환하지 않습니다. 해당 변환 의미론이 모든 애플리케이션에서 올바르지 않았기 때문입니다. xmlrpclib 를 사용하는 코드는 datetime 인스턴스를 직접 변환해야 합니다. (bpo-1330538)

  • (3.0-warning 모드) Exception 클래스를 슬라이싱이나 인덱스 접근으로 사용할 때 경고가 발생합니다. Exception 이 튜플처럼 동작하는 기능은 단계적으로 폐지되고 있습니다.

  • (3.0-warning 모드) 두 개의 딕셔너리 또는 비교 메서드가 구현되지 않은 두 객체 간의 부등산술 비교 시 경고가 보고됩니다. dict1 == dict2 는 여전히 작동하지만, dict1 < dict2 는 단계적으로 폐지되고 있습니다.

    Python 범위 규칙의 구현 세부 사항인 셀(cell) 간의 비교도 경고를 발생시키며, 이는 3.0에서 이러한 비교가 완전히 금지되었기 때문입니다.

Python을 내장하는 애플리케이션을 위한 사항:

  • PySys_SetArgvEx() 함수가 Python 2.6.6에 추가되어 기존의 PySys_SetArgv() 함수를 사용할 때 발생할 수 있는 보안 허점을 방지할 수 있게 되었습니다. 현재 PySys_SetArgv`를 호출하고 있는지 확인하고, 애플리케이션이 *updatepath*가 false로 설정된 :c:func:()!PySys_SetArgvEx`를 사용해야 하는지 신중하게 검토하십시오.

감사의 말

필자는 이 글의 다양한 초안에 대해 제안, 수정 및 도움을 제공해 준 다음 사람들에게 감사드립니다: Georg Brandl, Steve Brown, Nick Coghlan, Ralph Corderoy, Jim Jewett, Kent Johnson, Chris Lambacher, Martin Michlmayr, Antoine Pitrou, Brian Warner.

분실물 보관소