Python 2.6의 새로운 기능¶
- 저자:
A.M. Kuchling (amk at 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에서 지원되지 않을 사용에 대해 경고하는 등 가능한 모든 것을 시도합니다.
multiprocessing 및 json 모듈과 같이 표준 라이브러리에 상당한 새 패키지들이 추가되었지만, 3.0과 관련되지 않은 새로운 기능은 많지 않습니다.
Python 2.6은 소스 전반에 걸쳐 여러 개선 사항과 버그 수정이 있었습니다. 변경 로그를 검색해 보면 Python 2.5와 2.6 사이에 259개의 패치가 적용되었고 612개의 버그가 수정된 것을 찾을 수 있습니다. 이 두 수치 모두 과소평가일 가능성이 높습니다.
이 문서는 새로운 기능의 완전한 명세치를 제공하기보다는 편리한 개요를 제공하는 것을 목적으로 합니다. 전체 세부 사항을 원하시면 Python 2.6의 문서를 참조해 주십시오. 설계 및 구현에 대한 근거를 이해하고 싶으시다면, 특정 새로운 기능에 대한 PEP를 참고하세요. 가능한 경우, “Python의 새로운 기능” 링크는 각 변경 사항에 대한 버그/패치 항목으로 연결됩니다.
Python 3.0¶
Python 버전 2.6과 3.0의 개발 주기는 동기화되었으며, 두 버전 모두 알파 및 베타 출시는 같은 날에 이루어졌습니다. 3.0의 개발은 2.6의 많은 기능에 영향을 미쳤습니다.
Python 3.0은 Python 2.x 시리즈와의 호환성을 깨는 광범위한 재설계입니다. 이는 기존 Python 코드가 3.0에서 실행되려면 일부 변환이 필요하다는 것을 의미합니다. 그러나 3.0의 모든 변경 사항이 반드시 호환성을 깨뜨리는 것은 아닙니다. 새로운 기능들이 기존 코드를 깨뜨리지 않을 경우, 이들은 2.6으로 백포팅되었으며 본 문서에 적절한 위치에서 설명됩니다. 3.0에서 파생된 일부 기능은 다음과 같습니다:
객체를 복소수로 변환하기 위한
__complex__()메서드입니다.예외를 포착하는 대체 구문:
except TypeError as exc내장된
reduce()함수의 동의어로 :func:`functools.reduce`가 추가되었습니다.
Python 3.0은 여러 새로운 내장 함수를 추가하고 일부 기존 내장점들의 의미론을 변경합니다. 3.0에서 새롭게 추가된 bin`과 같은 함수들은 단순히 Python 2.6에 추가되었지만, 기존 내장 함수들은 변경되지 않았습니다. 대신, :mod:()!future_builtins` 모듈에는 새로운 3.0의 의미론을 가진 버전이 있습니다. 3.0과 호환되도록 작성된 코드는 필요에 따라 from future_builtins import hex, map 을 사용할 수 있습니다.
새로운 명령줄 스위치인 -3`은 Python 3.0에서 제거될 기능에 대해 경고를 활성화합니다. 코드 포팅에 필요한 작업량을 확인하기 위해 이 스위치를 사용하여 코드를 실행할 수 있습니다. 이 스위치의 값은 Python 코드에서는 불리언 변수 :data:!sys.py3kwarning`으로, C 확장 코드에서는 :c:data:`!Py_Py3kWarningFlag`로 사용할 수 있습니다.
개발 과정의 변화¶
2.6 버전 개발 당시, 파이썬 개발 과정에서는 두 가지 중요한 변화가 있었습니다: 이슈 추적기 출처를 SourceForge에서 맞춤형 Roundup 설치로 변경했고, 문서도 LaTeX에서 reStructuredText로 전환되었습니다.
새로운 이슈 추적기: Roundup¶
오랫동안 파이썬 개발자들은 SourceForge의 버그 트래커에 점점 짜증을 느끼고 있었습니다. SourceForge가 제공하는 호스팅 솔루션은 사용자 지정(customization)할 부분이 많지 않습니다. 예를 들어, 이슈의 라이프 사이클을 커스터마이징하는 것이 불가능했습니다.
따라서 파이썬 소프트웨어 재단(Python Software Foundation)의 인프라 위원회는 이슈 트래커 관련 공지를 게시하여 자원봉사자들에게 다양한 제품을 구축하고 SourceForge에서 버그 및 패치 일부를 가져올 것을 요청했습니다. 네 가지 다른 추적기가 검토되었습니다: Jira, Launchpad, Roundup, 그리고 Trac. 위원회는 궁극적으로 Jira와 Roundup 두 가지 후보로 결정했습니다. Jira는 무료 소프트웨어 프로젝트에 비용이 들지 않는 호스팅 인스턴스를 제공하는 상용 제품이며, Roundup은 자원봉사자가 관리하고 서버를 갖추어야 하는 오픈 소스 프로젝트입니다.
자원봉사자를 대상으로 공지를 게시한 후, https://bugs.python.org에 새로운 Roundup 설치가 이루어졌습니다. 하나의 Roundup 설치는 여러 트래커를 호스팅할 수 있으며, 이 서버는 이제 Jython 및 파이썬 웹사이트의 이슈 추적기도 호스팅합니다. 앞으로 분명 다른 용도로도 사용될 것입니다. 가능하다면, “Python에서 새로워진 점” 편집본에서는 각 변경 사항에 대한 버그/패치 항목으로 링크가 제공됩니다.
파이썬 버그 트래커의 호스팅은 남아프리카공화국 스텔렌보시(Stellenbosch) 소재 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의 변환 스크립트입니다.
새로운 문서 형식: reStructuredText 사용 Sphinx¶
파이썬 문서는 프로젝트가 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 출력을 중점적으로 다루어 매력적인 스타일의 현대적인 HTML을 생성합니다. 인쇄된 출력은 LaTeX로 변환하여 여전히 지원됩니다. 입력 형식은 Python 커뮤니티에서 일반적으로 사용되는 사용자 정의 확장 기능과 디렉티브를 지원하는 마크업 구문인 reStructuredText입니다.
Sphinx는 작성에 사용될 수 있는 독립 실행형 패키지이며, 무려 스핑크스 웹 사이트 <https://www.sphinx-doc.org/en/master/examples.html>에 나열된 다른 24개 이상의 프로젝트들이 문서화 도구로 Sphinx를 채택했습니다.
더 보기
- Python 설명서 <https://devguide.python.org/documenting/>으로 문서를 작성하기
파이썬 문서 작성 방법을 설명합니다.
- Sphinx <https://www.sphinx-doc.org/>
Sphinx 툴체인용 문서 및 코드입니다.
- Docutils <https://docutils.sourceforge.io>
기반 재구조화 텍스트 파서 및 도구 모음입니다.
PEP 343: ‘with’ 문¶
이전 버전인 Python 2.5에서는 ‘with’ 문을 선택적 기능으로 추가했으며, 이는 from __future__ import with_statement 지시문을 통해 활성화해야 했습니다. 2.6부터는 이 문이 특별히 활성화될 필요가 없어졌으며, 이는 with`가 이제 항상 키워드임을 의미합니다. 이 섹션의 나머지는 "Python 2.5에 새로운 기능" 문서의 해당 섹션을 복사한 것입니다. 만약 Python 2.5의 ':keyword:!with`’ 문에 익숙하시다면, 이 섹션을 건너뛰셔도 됩니다.
‘with’ 문은 이전에 정리 코드를 실행하도록 try...finally 블록을 사용했던 코드를 명확히 합니다. 본 섹션에서는 해당 문이 일반적으로 사용될 방법을 논의할 것입니다. 다음 섹션에서는 구현 세부 사항을 살펴보고 이 문과 함께 사용할 객체를 작성하는 방법을 보여드리겠습니다.
‘with’ 문은 기본적인 구조가 다음과 같은 제어 흐름 구문입니다:
with expression [as variable]:
with-block
이 표현식은 평가되며, 컨텍스트 관리 프로토콜을 지원하는 객체를 반환해야 합니다 (즉, __enter__() 및 __exit__() 메서드를 가지고 있어야 합니다).
with-block 이 실행되기 전에 객체의 __enter__() 가 호출되므로, 설정 코드를 실행할 수 있습니다. 또한, 제공된 경우 variable 이라는 이름에 바인딩되는 값을 반환할 수도 있습니다. (variable 은 expression 의 결과로 할당되지 않는다는 점을 유의하십시오.)
with-block 실행이 완료된 후, 블록에서 예외가 발생했더라도 객체의 __exit__() 메서드가 호출되므로 정리 코드를 실행할 수 있습니다.
일부 표준 Python 객체는 이제 컨텍스트 관리 프로토콜을 지원하며 ‘with’ 문에서 사용할 수 있습니다. 파일 객체가 그 예입니다:
with open('/etc/passwd', 'r') as f:
for line in f:
print line
... more processing code ...
이 구문이 실행된 후에는, for 루프가 블록 중간에 예외를 발생시키더라도 f 의 파일 객체는 자동으로 닫힙니다.
참고
이 경우, f 는 open() 에 의해 생성된 것과 동일한 객체입니다. 왜냐하면 __enter__() 가 self 를 반환하기 때문입니다.
threading 모듈의 락(lock)과 조건 변수도 ‘with’ 문을 지원합니다:
lock = threading.Lock()
with lock:
# 임계 코드 섹션입니다
...
이 블록이 실행되기 전에 락이 획득되고, 블록이 완료되면 항상 해제됩니다.
decimal 모듈의 localcontext() 함수는 현재의 십진수 컨텍스트를 저장하고 복원하기 쉽게 해주며, 이를 통해 계산에 대한 원하는 정밀도 및 반올림 특성을 캡슐화합니다:
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입니다.
예시를 들어 보겠습니다. 상세한 코드를 제시하지 않고, 트랜잭션을 지원하는 데이터베이스에 필요한 메서드들만 개략적으로 설명하겠습니다.
(데이터베이스 용어에 익숙하지 않은 분들을 위해: 데이터베이스의 일련의 변경 사항들은 트랜잭션으로 그룹화됩니다. 트랜잭션은 모두 데이터베이스에 기록되는 커밋되거나, 모든 변경 사항이 폐기되고 데이터베이스가 변경되지 않는 롤백될 수 있습니다. 더 많은 정보는 모든 데이터베이스 교과서를 참고하십시오.)
데이터베이스 연결을 나타내는 객체가 있다고 가정해 보겠습니다. 우리의 목표는 사용자가 다음과 같은 코드를 작성할 수 있도록 하는 것입니다:
db_connection = DatabaseConnection()
with db_connection as cursor:
cursor.execute('insert into ...')
cursor.execute('delete from ...')
# ... 추가 작업 ...
블록 안의 코드가 오류 없이 실행되면 트랜잭션은 커밋되어야 하고, 예외가 발생하면 롤백되어야 합니다. 제가 가정할 :class:`!DatabaseConnection`의 기본 인터페이스는 다음과 같습니다:
class DatabaseConnection:
# 데이터베이스 인터페이스
def cursor(self):
"커서 객체를 반환하고 새 트랜잭션을 시작합니다."
def commit(self):
"현재 트랜잭션을 커밋합니다"
def rollback(self):
"현재 트랜잭션을 롤백합니다"
__enter__() 메서드는 새 트랜잭션을 시작하기만 하면 되므로 매우 간단합니다. 이 애플리케이션의 경우 결과 커서 객체가 유용한 결과가 될 것이므로, 이 메서드는 이를 반환합니다. 그러면 사용자는 ‘with ‘ 구문에 as cursor 를 추가하여 커서를 변수 이름에 바인딩할 수 있습니다.
class DatabaseConnection:
...
def __enter__(self):
# 새 트랜잭션을 시작하는 코드
cursor = self.cursor()
return cursor
__exit__() 메서드가 가장 복잡한데, 왜냐하면 대부분의 작업이 이 메서드에서 처리되어야 하기 때문입니다. 이 메서드는 예외가 발생했는지 확인해야 합니다. 예외가 없으면 트랜잭션은 커밋됩니다. 예외가 있으면 트랜잭션은 롤백됩니다.
아래 코드에서는 실행이 함수 끝까지 진행되어 기본값인 None 을 반환할 것입니다. None 은 false 값이므로 예외가 자동으로 다시 발생합니다. 원한다면, 표시된 위치에 return 문을 추가하여 더 명시적으로 만들 수 있습니다.
class DatabaseConnection:
...
def __exit__(self, type, value, tb):
if tb is None:
# 예외 없음, 커밋함
self.commit()
else:
# 예외 발생, 롤백합니다.
self.rollback()
# return False
contextlib 모듈¶
contextlib 모듈은 ‘with’ 구문과 함께 사용할 객체를 작성할 때 유용한 일부 함수와 데코레이터를 제공합니다.
The decorator is called @~contextlib.contextmanager, and lets you write
a single generator function instead of defining a new class. The generator
should yield exactly one value. The code up to the yield will be
executed as the __enter__() method, and the value yielded will
be the method’s return value that will get bound to the variable in the
‘with’ statement’s as clause, if any. The code after
the yield will be executed in the __exit__() method.
Any exception raised in the block will be raised by the yield
statement.
이 데코레이터를 사용하여, 이전 섹션의 데이터베이스 예제를 다음과 같이 작성할 수 있습니다:
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, ...) 함수가 있어 중첩된 :keyword: 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는
:keyword:with`’ 문에 대해 생성된 코드를 보여주며, 해당 문이 어떻게 작동하는지 학습하는 데 도움이 될 수 있습니다.
contextlib 모듈의 설명서입니다.
PEP 366: 메인 모듈에서의 명시적 상대 임포트¶
Python의 -m 스위치는 모듈을 스크립트로 실행하는 것을 허용합니다. 패키지 내에 위치한 모듈을 실행했을 때, 상대 임포트는 올바르게 작동하지 않았습니다.
Python 2.6의 수정 사항은 module.__package__ 어트리뷰트를 추가했습니다. 이 어트리뷰트가 존재하면, 상대 임포트는 __name__ 어트리뷰트 대신 이 어트리뷰트의 값에 상대적입니다.
PEP 302 스타일의 임포터를 사용하면 필요한 대로 :option:-m` 스위치를 구현하는 runpy 모듈이 이제 이를 수행하므로, 패키지 내부에서 실행되는 스크립트에서는 상대 임포트가 올바르게 작동합니다.
PEP 370: 사용자별 site-packages 디렉터리¶
Python으로 프로그램을 실행하면 모듈 검색 경로인 sys.path 에는 일반적으로 "site-packages" 로 끝나는 경로를 포함하는 디렉터리가 있습니다. 이 경로는 장치 또는 특정 설치 사이트에서 모든 사용자가 사용할 수 있는 로컬에 설치된 패키지를 담기 위한 것입니다.
Python 2.6은 사용자별 사이트 디렉터리에 대한 규칙을 도입합니다. 이 경로는 플랫폼에 따라 다릅니다.
Unix 및 Mac OS X:
~/.local/Windows:
%APPDATA%/Python
이 디렉터리 안에는 Unix/Mac OS의 경우 lib/python2.6/site-packages`와 Windows의 경우 :file:`Python26/site-packages 같은 버전별 서브디렉터리가 존재합니다.
기본 디렉터리가 마음에 들지 않는다면, 환경 변수를 통해 재정의할 수 있습니다. PYTHONUSERBASE`는 이 기능을 지원하는 모든 파이썬 버전에 사용되는 루트 디렉토리를 설정합니다. Windows에서 애플리케이션별 데이터에 대한 디렉터리는 :envvar:!APPDATA` 환경 변수를 설정하여 변경할 수 있습니다. 또한 파이썬 설치의 site.py 파일을 수정할 수도 있습니다.
-s 옵션을 사용하여 실행하거나 PYTHONNOUSERSITE 환경 변수를 설정하여 이 기능을 완전히 비활성화할 수 있습니다.
더 보기
- PEP 370 - Per-user
site-packagesDirectory Christian Heimes가 작성하고 구현했습니다.
PEP 371: multiprocessing 패키지¶
새로운 multiprocessing 패키지는 파이썬 프로그램이 계산을 수행하고 결과를 부모 프로세스로 반환하는 새로운 프로세스를 생성할 수 있게 해줍니다. 부모와 자식 프로세스는 큐와 파이를 사용하여 통신하고, 잠금(locks)과 세마포어(semaphores)를 사용하여 작업을 동기화하며, 간단한 데이터 배열을 공유할 수 있습니다.
multiprocessing 모듈은 원래 스레드 대신 프로세스를 사용하여 threading 모듈의 정확한 에뮬레이션이었습니다. 이 목표는 Python 2.6으로 가는 과정에서 폐기되었지만, 모듈의 일반적인 접근 방식은 여전히 유사합니다. 근본적인 클래스는 start 메서드는 서브프로세스에서 실행되는 호출 가능한 대상을 설정하며, 이후에 is_alive() 메서드를 호출하여 서브프로세스가 여전히 실행 중인지 확인할 수 있고, join() 메서드를 사용하여 프로세스가 종료될 때까지 기다릴 수 있습니다.
여기 서브프로세스가 팩토리얼을 계산하는 간단한 예제가 있습니다. 이 계산을 수행하는 함수는 입력 인수가 4의 배수일 때 현저히 더 오래 걸리도록 비정상적으로 작성되었습니다.
import time
from multiprocessing import Process, Queue
def factorial(queue, N):
"팩토리얼을 계산합니다."
# N이 4의 배수이면, 이 함수는 훨씬 오래 걸릴 것입니다.
if (N % 4) == 0:
time.sleep(.05 * N/4)
# 결과를 계산합니다
fact = 1L
for i in range(1, N+1):
fact = fact * i
# 결과를 큐에 넣습니다
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 이기 때문에 부모와 자식 모두 이 객체를 사용하여 통신할 수 있습니다. (만약 부모가 전역 변수의 값을 변경하더라도, 자식의 값은 영향을 받지 않으며 그 반대도 마찬가지입니다.)
다른 두 가지 클래스인 apply 또는 map() 또는 :meth:`~multiprocessing.pool.Pool.map_async`를 호출하여 여러 요청을 추가할 수 있습니다. 다음 코드는 :class:`~multiprocessing.pool.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() 메서드를 호출하여 공유 딕셔너리를 생성하며, 워커 프로세스들이 이 딕셔너리에 값을 삽입합니다. (락킹은 자동으로 수행되지 않는데, 이는 이 예제에서는 문제가 되지 않습니다. Lock, RLock(), 및 :meth:`~multiprocessing.managers.SyncManager.Semaphore`가 포함됩니다.)
import time
from multiprocessing import Pool, Manager
def factorial(N, dictionary):
"팩토리얼을 계산합니다."
# 결과를 계산합니다
fact = 1L
for i in range(1, N+1):
fact = fact * i
# 딕셔너리에 결과를 저장합니다
dictionary[N] = fact
if __name__ == '__main__':
p = Pool(5)
mgr = Manager()
d = mgr.dict() # 공유 딕셔너리 생성
# 풀을 사용하여 작업을 실행합니다
for N in range(1, 1000, 10):
p.apply_async(factorial, (N, d))
# 풀을 닫아 작업 추가를 중단합니다.
p.close()
# 작업이 종료될 때까지 기다립니다.
p.join()
# 결과를 출력합니다
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 - 멀티프로세싱 패키지 추가에 대한 제안
Jesse Noller와 Richard Oudkerk가 작성하고, Richard Oudkerk와 Jesse Noller가 구현한 PEP.
PEP 3101: 고급 문자열 포매팅¶
파이썬 3.0에서 % 연산자는 보다 강력한 문자열 포매팅 메서드인 format() 으로 보완되었습니다. str.format() 메서드 지원은 파이썬 2.6으로 백포트되었습니다.
2.6 버전에서는 8비트 문자열과 유니코드 문자열 모두 해당 문자열을 템플릿으로 취급하고 포매팅할 인자를 받는 .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 '
원하는 너비 내에서 필드의 정렬을 지정할 수 있습니다:
문자 |
효과 |
|---|---|
< (기본값) |
왼쪽 정렬 |
> |
오른쪽 정렬 |
^ |
가운데 정렬 |
= |
(숫자형에만 해당) 부호 뒤에 패딩합니다. |
포맷 지정자는 또한 값의 포매팅 방식을 제어하는 표현 방식도 포함할 수 있습니다. 예를 들어, 부동 소수점 숫자는 일반 숫자 또는 지수 표기법으로 포맷될 수 있습니다:
>>> '{0:g}'.format(3.75)
'3.75'
>>> '{0:e}'.format(3.75)
'3.750000e+00'
다양한 표현 방식이 사용 가능합니다. complete list 를 참조하여 2.6 버전 문서를 참고해 주세요. 여기 샘플이 하나 있습니다:
|
Binary 형식. 숫자를 2진법으로 출력합니다. |
|
문자. 정수를 해당 유니코드 문자로 변환하여 출력합니다. |
|
십진수 정수. 숫자를 10진법으로 출력합니다. |
|
팔진 형식. 숫자를 8진법으로 출력합니다. |
|
16진 형식. 숫자를 16진법으로 출력하며, 9보다 큰 자릿수는 소문자를 사용합니다. |
|
지수 표기법. 지수를 나타내는 문자로 ‘e’를 사용하여 숫자를 과학적 표기법으로 출력합니다. |
|
일반 형식. 이 형식은 숫자가 너무 크지 않은 한 고정 소수점 숫자로 출력하며, 그 이상인 경우 ‘e’ 지수 표기법으로 전환됩니다. |
|
숫자. 이 형식은 ‘g’(float의 경우) 또는 ‘d’(정수의 경우)와 같지만, 현재 로케일 설정을 사용하여 적절한 숫자 구분 문자들을 삽입한다는 점이 다릅니다. |
|
백분율. 숫자에 100을 곱하고 고정 (‘f’) 형식으로 표시한 뒤 백분율 기호를 붙입니다. |
클래스와 타입은 __format__() 메서드를 정의하여 포매팅 방식을 제어할 수 있습니다. 이 메서드는 단일 인수인 형식 지정자(format specifier)를 받습니다:
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 3105: print 을 함수로 사용하기¶
print() 문은 Python 3.0에서 print() 함수가 됩니다. print() 를 함수로 만들면 def print(...) 으로 함수를 대체하거나 다른 곳에서 새 함수를 임포트하는 것이 가능해집니다.
Python 2.6은 print`을 언어 구문이 아닌 것으로 제거하는 ``__future__` 임포트를 가지고 있어서 대신 함수 형태로 사용할 수 있게 됩니다. 예를 들면 다음과 같습니다:
>>> 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 - print를 함수로 만들기
Georg Brandl이 작성한 PEP입니다.
PEP 3110: 예외 처리 변경 사항¶
Python 프로그래머들이 가끔 저지르는 오류 중 하나는 다음과 같은 코드를 작성하는 것입니다:
try:
...
except TypeError, ValueError: # 잘못됨!
...
작성자는 아마도 TypeError 와 ValueError 예외 둘 다를 포착하려고 하는 것 같지만, 이 코드는 실제로는 다른 작업을 수행합니다. 즉, 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 - Python 3000에서의 예외 포착
Collin Winter가 작성하고 구현한 PEP입니다.
PEP 3112: 바이트 리터럴¶
Python 3.0은 유니코드를 언어의 기본 문자열 타입으로 채택하고, 8비트 리터럴을 b'string' 또는 bytes 생성자를 사용하여 다르게 표시합니다. 향후 호환성을 위해 Python 2.6에서는 str`에 대한 별칭으로 :class:`bytes`를 추가했으며, ``b''` 표기법도 지원합니다.
2.6의 str() 은 3.0의 bytes 타입과 여러 면에서 다릅니다; 가장 눈에 띄는 점은 생성자가 완전히 다르다는 것입니다. 3.0에서는 bytes([65, 66, 67]) 가 ABC 를 나타내는 바이트를 담아 3 요소의 리스트인 반면, 2.6에서는 bytes([65, 66, 67]) 가 리스트의 str 을 나타내는 12바이트 문자열을 반환합니다.
2.6에서 bytes`의 주된 용도는 ``isinstance(x, bytes)``와 같은 객체 타입을 테스트하는 것입니다. 이는 2to3 컨버터가 2.x 코드가 문자열에 문자를 포함할지 아니면 8비트 바이트를 포함할지 구별할 수 없기 때문입니다. 이제 원하는 의도를 정확하게 나타내기 위해 :class:`bytes`나 :class:`str 중 어느 것을 사용해도 되며, 그 결과 코드 또한 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 Unicode characters
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'
Byte arrays support most of the methods of string types, such as
startswith()/endswith(),
find()/rfind(),
and some of the methods of lists, such as append(),
pop(), and 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 object)를 담고 있는raw속성을 추가합니다.이 ABC를 구현하는 다섯 가지 구체적인 클래스가 있습니다.
BufferedWriter와BufferedReader는 무작위 액세스를 위해seek()메서드를 갖는 쓰기 전용 또는 읽기 전용 사용을 지원하는 객체를 위한 것입니다.BufferedRandom객체들은 동일한 기본 스트림에 대해 읽기와 쓰기 접근을 지원하며,BufferedRWPair는 연결되지 않은 데이터 스트림에 읽기 및 쓰기 작업이 작용하는 TTY와 같은 객체를 위한 것입니다.BytesIO클래스는 메모리 버퍼를 통해 읽기, 쓰기, 검색을 지원합니다.TextIOBase: 문자열을 읽고 쓰는 기능을 제공하며 (기억하세요, 파이썬 3.0에서는 문자열이 유니코드입니다), universal newlines 를 지원합니다.TextIOBase는readline()메서드를 정의하고 객체에 대한 반복을 지원합니다.두 개의 구체적인 구현체가 있습니다.
TextIOWrapper는 버퍼링된 I/O 객체를 래핑하며, 텍스트 I/O의 모든 메서드를 지원하고 기본 객체에 액세스하기 위한buffer속성을 추가합니다.StringIO는 디스크에 아무것도 쓰지 않고 메모리에서 모든 것을 버퍼링할 뿐입니다.(파이썬 2.6에서,
io.StringIO`는 순수 파이썬으로 구현되므로 매우 느립니다. 따라서 당분간은 기존의 :mod:!StringIO` 모듈이나cStringIO`를 사용해야 합니다. 어느 시점에는 파이썬 3.0의 :mod:`io모듈도 속도를 위해 C로 재작성될 것이며, 어쩌면 이 C 구현이 2.x 릴리스에도 백포팅될 수 있을 것입니다.)
파이썬 2.6에서는 underlying implementation들이 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: 수정된 버퍼 프로토콜¶
버퍼 프로토콜은 Python 유형들이 내부 표현의 포인터를 교환할 수 있도록 하는 C 레벨 API입니다. 예를 들어, 메모리 맵 파일은 문자의 버퍼로 간주될 수 있으며, 이를 통해 :mod:`re`와 같은 다른 모듈이 메모리 맵 파일을 검색해야 하는 문자열처럼 처리할 수 있게 해줍니다.
버퍼 프로토콜의 주 사용자는 NumPy와 같은 수치 처리 패키지들입니다. 이들은 배열의 내부 표현을 노출하여 호출자들이 느린 API를 거치는 대신 배열에 직접 데이터를 쓸 수 있도록 합니다. 본 PEP는 NumPy 개발 경험에 비추어 버퍼 프로토콜을 업데이트하며, 배열의 모양(shape) 지정 또는 메모리 영역 잠금과 같은 여러 새로운 기능을 추가합니다.
가장 중요한 새로운 C API 함수는 PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags)``입니다. 이 함수는 객체와 플래그 세트를 받아 해당 객체의 메모리 표현에 대한 정보를 ``Py_buffer 구조체에 채워 넣습니다. 객체들은 이 작업을 사용하여 외부 호출자가 내용을 수정하는 동안 메모리를 제자리에 잠글 수 있으며, 외부 호출이 완료되었음을 나타내는 상응하는 PyBuffer_Release(Py_buffer *view) 함수가 있습니다.
:c:func:`PyObject_GetBuffer`의 flags 인자에는 반환되는 메모리에 대한 제약 조건이 명시됩니다. 몇 가지 예시는 다음과 같습니다:
:c:macro:`PyBUF_WRITABLE`은 해당 메모리가 쓰기 가능해야 함을 나타냅니다.
:c:macro:`PyBUF_LOCK`은 메모리에 읽기 전용 또는 독점 잠금을 요청합니다.
:c:macro:`PyBUF_C_CONTIGUOUS`와 :c:macro:`PyBUF_F_CONTIGUOUS`는 C-연속 (마지막 차원이 가장 빠르게 변함) 또는 Fortran-연속 (첫 번째 차원이 가장 빠르게 변함) 배열 레이아웃을 요청합니다.
PyArg_ParseTuple() 의 두 가지 새로운 인자 코드인 s* 와 z* 는 파라미터에 대한 잠금된 버퍼 객체를 반환합니다.
더 보기
- PEP 3118 - 버퍼 프로토콜 개정
PEP는 Travis Oliphant와 Carl Banks가 작성하고, Travis Oliphant가 구현했습니다.
PEP 3119: 추상 베이스 클래스¶
Java와 같은 일부 객체 지향 언어는 인터페이스를 지원하여, 클래스가 주어진 메서드 세트를 가지고 있거나 특정 접근 프로토콜을 지원함을 선언할 수 있습니다. 추상 베이스 클래스(또는 ABC)가 Python에 대한 이에 준하는 기능입니다. ABC 지원은 메타 클래스로 ABCMeta`를 포함하는 :mod:`abc 모듈, 내장 함수인 :func:`isinstance`와 :func:`issubclass`의 이 메타 클래스에 대한 특별한 처리, 그리고 Python 개발자들이 광범위하게 유용할 것이라 생각하는 기본 ABC들의 모음으로 구성됩니다. 향후 버전의 Python에는 더 많은 ABC가 추가될 가능성이 높습니다.
특정 클래스가 딕셔너리 스타일 접근을 지원하는지 알고 싶다고 가정해 봅시다. 하지만 “딕셔너리 스타일”이라는 표현은 모호합니다. 아마도 obj[1] 로 항목에 접근하는 것이 작동한다는 의미일 것입니다. 그것이 obj[2] = value 로 항목 설정이 가능하다는 것을 의미할까요? 아니면 객체가 keys(), values(), 및 items() 메서드를 가질 것인가요? iterkeys() 와 같은 반복자 변형은 어떻습니까? 그리고 copy() 와 update() 는요? iter() 로 객체를 반복하는 것은요?
Python 2.6의 collections 모듈에는 이러한 구분을 나타내는 여러 ABC가 포함되어 있습니다. Iterable`은 클래스가 :meth:`~object.__iter__`를 정의함을 나타내고, :class:`Container`는 해당 클래스가 :meth:`~object.__contains__ 메서드를 정의하여 따라서 x in y 표현식을 지원한다는 의미입니다. 항목을 가져오거나, 항목을 설정하고, 그리고 keys(), values(), 및 items`를 사용하는 기본적인 딕셔너리 인터페이스는 :class:`MutableMapping() ABC에 의해 정의됩니다.
특정 ABC가 해당 ABC의 인터페이스를 지원함을 나타내기 위해 특정 ABC로부터 자신만의 클래스를 파생시킬 수 있습니다:
import collections
class Storage(collections.MutableMapping):
...
대안적으로는, 원하는 ABC를 상속받지 않고 그 대신 ABC의 register() 메서드를 호출하여 클래스를 등록할 수도 있습니다:
import collections
class Storage:
...
collections.MutableMapping.register(Storage)
작성하는 클래스의 경우, ABC에서 상속받는 것이 더 명확할 것입니다. register() 메서드는 기존 타입을 설명하거나 클래스가 특정 ABC를 구현한다고 선언하려는 새로운 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)
위 예제처럼 많은 검사를 시작해야 한다고 느끼지 마십시오. 파이썬은 덕 타이핑이라는 강력한 전통을 가지고 있으며, 여기서는 명시적인 타입 검사가 전혀 이루어지지 않고 코드가 단순히 객체의 메서드를 호출하며 해당 메서드가 존재할 것이라고 신뢰하고, 만약 그렇지 않다면 예외를 발생시킵니다. 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를 구현하는 클래스는 자신만의 :meth:!draw_doubled` 구현을 제공할 필요는 없지만, 그렇게 할 수는 있습니다. 다만, :meth:`!draw`에 대한 구현은 필수적입니다. ABC는 유용한 일반적인 구현을 제공할 수 없기 때문입니다.
You can apply the @~abc.abstractmethod decorator to methods such as
draw() that must be implemented; Python will then raise an
exception for classes that don’t define the method.
Note that the exception is only raised when you actually
try to create an instance of a subclass lacking the method:
>>> 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 - 추상 베이스 클래스 도입
Guido van Rossum과 Talin이 작성하고, Guido van Rossum가 구현했습니다. Benjamin Aranguren과 Alex Martelli에 의해 2.6으로 백포트되었습니다.
PEP 3127: 정수 리터럴 지원 및 문법¶
Python 3.0은 8진수(base-8) 정수 리터럴의 문법을 수정하여, 앞에 선행하는 0 대신 “0o” 또는 “0O”를 접두사로 사용하며, 이진수(base-2) 정수 리터럴에 대한 지원을 추가하고 “0b” 또는 “0B” 접두사로 표시합니다.
Python 2.6은 여전히 선행하는 `0`이 8진수를 나타내는 지원을 제거하지 않지만, 이제 “0o”와 “0b”::를 추가 지원합니다:
>>> 0o21, 2*8 + 1
(17, 17)
>>> 0b101111
47
oct() 내장 함수는 여전히 선행하는 0`이 붙은 숫자를 반환하고, 새로운 :func:`bin 내장 함수는 숫자의 이진 표현을 반환합니다:
>>> oct(42)
'052'
>>> future_builtins.oct(42)
'0o52'
>>> bin(173)
'0b10101101'
int`와 :func:`long() 내장 함수는 이제 base-8 또는 base-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)이 작성하고; 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) 를 통해 확인할 수 있도록 존재할 뿐입니다.
:class:`Complex`는 :class:`Number`의 서브클래스입니다. 복소수는 덧셈, 뺄셈, 곱셈, 나눗셈 및 거듭제곱과 같은 기본 연산을 수행할 수 있으며, 실수부와 허수부를 검색하고 숫자의 켤레 복소수를 얻을 수 있습니다. 파이썬의 내장 복소수 타입은 :class:`Complex`의 구현체입니다.
Real`은 :class:`Complex`로부터 파생하며 실수만을 다루는 연산들인 :func:`floor, trunc(), 반올림, 나머지 계산 (mod N), 몫 계산, 그리고 비교 연산을 추가합니다.
Rational numbers derive from Real, have
numerator and denominator properties, and can be
converted to floats. Python 2.6 adds a simple rational-number class,
Fraction, in the fractions module. (It’s called
Fraction instead of Rational to avoid
a name clash with numbers.Rational.)
Integral 숫자는 Rational 으로부터 파생하며, << 와 >> 를 사용하여 왼쪽 및 오른쪽으로 시프트될 수 있고, & 와 | 과 같은 비트와이즈 연산자를 결합할 수 있으며, 배열의 인덱스와 슬라이스 경계로 사용될 수 있습니다.
Python 3.0에서는 PEP가 기존 내장 함수 round(), math.floor(), :func:`math.ceil`을 약간 재정의하고, Python 2.6으로 백포팅된 새로운 함수인 :func:`math.trunc`를 추가했습니다. :func:`math.trunc`는 제로 방향으로 반올림하여 함수의 인자와 0 사이에서 가장 가까운 :class:`Integral`을 반환합니다.
더 보기
- PEP 3141 - 숫자를 위한 타입 계층 구조
Jeffrey Yasskin이 작성했습니다. PEP.
Guile 매뉴얼의 Scheme’s numerical tower, 구일 매뉴얼에서 가져옴.
R5RS Scheme 명세의 `Scheme’s number datatypes <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 모듈은 오랫동안 Python의 Demo/classes/ 디렉토리에 있던 Sjoerd Mullender의 구현을 기반으로 합니다. 이 구현은 Jeffrey Yasskin에 의해 크게 업데이트되었습니다.
이외의 언어 변경 사항¶
핵심 파이썬 언어에 일부 작은 변경 사항들이 있습니다.
__main__.py파일이 포함된 디렉토리와 zip 아카이브는 이제 인터프리터에 이름을 전달하여 직접 실행될 수 있습니다. 해당 디렉토리나 zip 아카이브는 자동으로 sys.path의 첫 번째 항목으로 삽입됩니다. ((제안 및 초기 패치 by Andy Chu, 이후 Phillip J. Eby와 Nick Coghlan이 수정; bpo-1739468.)hasattr()함수는 자신이 직관적으로__getattr__()메서드가 어떤 식으로든 실패했고, 따라서hasattr`의 반환 값이 ``False``일 것이라고 가정하여 모든 오류를 가로채고 무시했습니다. 그러나 이 논리는 :exc:`KeyboardInterrupt`와 :exc:`SystemExit`에는 적용되어서는 안 되며; Python 2.6에서는 :func:`hasattr`가 이러한 예외에 직면해도 더 이상 그러한 예외들을 버리지 않습니다. (Benjamin Peterson이 수정함; :issue:`2196().)키워드 인자를 제공하기 위해
**문법을 사용하여 함수를 호출할 때, 더 이상 Python 딕셔너리를 사용해야 할 필요가 없습니다. 모든 매핑이 작동합니다:>>> 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 구현.)속성은 이제 세 개의 데코레이터,
@~property.getter,@~property.setter및 :deco:`~property.deleter`를 가집니다. 이들은 기존 속성에 getter, setter 또는 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
내장 set 타입의 여러 메서드가 이제 여러 이터러블을 받습니다:
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). 이러한 함수들은 부동 소수점을 문자열 표현으로 변환하며, 십진수와 이진수 간의 변환으로 인한 반올림 오류를 도입하지 않습니다. float는 문자열 표현을 반환하는
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)을 지원하는 시스템에서 두 개의 float으로부터 복소수를 생성할 때,
complex()생성자는 이제 0의 부호를 유지합니다. (Mark T. Dickinson 수정; bpo-1507.)부모 클래스로부터
__hash__()메서드를 상속받는 클래스는 해당 클래스가 해시 불가능함을 나타내기 위해__hash__ = None을 설정할 수 있습니다. 이렇게 하면hash(obj)가TypeError를 발생시키고, 해당 클래스가HashableABC를 구현하는 것으로 표시되지 않습니다.객체를 식별자 기준이 아닌 값으로 비교하는
__cmp__()또는__eq__()메서드를 정의했을 때는 이렇게 해야 합니다. 모든 객체는id(obj)를 해시 값으로 사용하는 기본 해시 메서드를 가지고 있습니다. 부모 클래스로부터 상속된__hash__()메서드를 제거할 깔끔한 방법이 없기 때문에,None을 할당하는 것이 오버라이드로 구현되었습니다. C 레벨에서는 확장 기능이tp_hash를PyObject_HashNotImplemented()로 설정할 수 있습니다. (Nick Coghlan 및 Amaury Forgeot d’Arc 수정; bpo-2235.)이제
GeneratorExit예외는Exception대신BaseException`을 서브클래스합니다. 이는 `except Exception:`를 실행하는 예외 핸들러가 실수로 :exc:`GeneratorExit`를 잡지 않게 됨을 의미합니다. (Chad Austin 기여자; :issue:`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을 변환 테이블 매개변수로 받을 수 있게 되었습니다. 이는 식별 변환(identity transformation)으로 처리됩니다. 이로써 문자만 삭제하는 작업을 수행하기가 더 쉬워졌습니다. (Bengt Richter가 기여하고 Raymond Hettinger가 구현했습니다; bpo-1193128.)내장
dir()함수는 이제 수신 객체에 대해__dir__()메서드를 확인합니다. 이 메서드는 반드시 유효한 속성 이름 목록을 포함하는 문자열 리스트를 반환해야 하며, 객체가dir`가 출력할 값을 제어하도록 합니다. :meth:`__getattr__`나 :meth:`__getattribute__()메서드를 가진 객체는 이를 사용하여 준(pseudo)-속성을 광고할 수 있습니다. (bpo-1591665)인스턴스 메서드 객체에는 해당 메서드를 포함하는 객체와 함수에 대한 새로운 속성들이 생겼습니다.
im_self`에 대한 새로운 동의어는 :attr:`~method.__self__`이며, :attr:!im_func` 역시 :attr:`~method.__func__`로 사용할 수 있습니다. 이전 이름들은 Python 2.6에서 여전히 지원되지만 3.0부터는 사라졌습니다.모호한 변경 사항:
class문 내에서locals()함수를 사용하면, 반환되는 딕셔너리가 더 이상 자유 변수를 포함하지 않습니다. (여기서 자유 변수란,class문에 참조되지만 클래스의 속성이 아닌 변수를 의미합니다.)
최적화¶
warnings모듈이 C로 재작성되었습니다. 이로 인해 파서에서 경고 호출이 가능하며 인터프리터 시작 속도 향상에도 도움이 될 수 있습니다. (Neal Norwitz와 Brett Cannon 기여; bpo-1631171.)타입 객체는 이제 특정 클래스의 올바른 메서드 구현을 찾는 데 필요한 작업을 줄일 수 있는 메서드 캐시를 갖게 되었습니다. 일단 캐싱되면, 인터프리터는 호출할 올바른 메서드를 알아내기 위해 기본 클래스를 탐색할 필요가 없습니다. 이 캐시는 기본 클래스나 클래스 자체가 수정되면 지워지므로, 따라서 캐시는 Python의 동적 특성 앞에서도 올바르게 유지될 것입니다. (:issue:`1700288`에 의해 Armin Rigo가 구현한 원래 최적화이며 Kevin Jacobs가 Python 2.6에 맞게 업데이트했습니다.)
기본적으로 이 변경 사항은 Python 코어와 함께 포함된 타입에만 적용됩니다. 확장 모듈이 반드시 이 캐시와 호환되는 것은 아닐 수 있으므로, 메서드 캐시를 활성화하려면 모듈의
tp_flags필드에Py_TPFLAGS_HAVE_VERSION_TAG를 명시적으로 추가해야 합니다. (메서드 캐시와 호환되려면 확장 모듈 코드가 구현하는 모든 타입의tp_dict멤버에 직접 접근하고 수정해서는 안 됩니다. 대부분의 모듈은 그렇지 않지만, Python 인터프리터가 이를 판단할 수 없습니다. 자세한 논의는 bpo-1878 를 참조하십시오.)키워드 인자(keyword arguments)를 사용하는 함수 호출은 빠른 포인터 비교를 통해 수행되어, 일반적으로 전체 문자열 비교 시간을 절약하므로 훨씬 빠릅니다. (Raymond Hettinger가 Antoine Pitrou의 초기 구현 이후 기여했습니다; bpo-1819.)
struct모듈의 모든 함수는 Need For Speed 스프린트 작업 덕분에 C로 재작성되었습니다. (Raymond Hettinger 기여.)일부 표준 내장 타입은 이제 그들의 타입 객체에 비트를 설정합니다. 이는 객체가 이러한 타입 중 하위 클래스인지 확인하는 속도를 높여줍니다. (Neal Norwitz 기여.)
유니코드 문자열은 이제 공백 및 줄 바꿈을 감지하는 데 더 빠른 코드를 사용합니다. 이는
split()메서드의 속도를 약 25% 향상시키고 :meth:`splitlines`의 속도를 35% 향상시킵니다. (Antoine Pitrou 기여.) 메모리 사용량은 유니코드 문자열 데이터에 pymalloc을 사용하여 줄였습니다.with문은 이제__exit__()메서드를 스택에 저장하여 약간의 속도 향상을 만듭니다. (Jeffrey Yasskin 구현.)메모리 사용량을 줄이기 위해, 가비지 컬렉터는 객체의 최고 세대(highest generation)를 가비지 수거할 때 내부 빈 목록(internal free lists)을 이제 비웁니다. 이는 운영 체제에 메모리를 더 빨리 반환할 수 있습니다.
인터프리터 변경 사항¶
두 개의 명령줄 옵션이 다른 파이썬 구현체에서 사용하도록 예약되었습니다. -J 스위치는 Jython_용 특정 옵션을 위해 Jython에 의해 예약되었으며, 기본 JVM으로 전달되는 스위치 등이 포함됩니다. :option:`-X`는 CPython, Jython 또는 IronPython과 같은 특정 파이썬 구현체에만 해당하는 옵션별로 예약되었습니다. 두 옵션 중 어느 하나라도 Python 2.6에서 사용되면 인터프리터가 해당 옵션은 현재 사용되지 않음을 보고합니다.
-B 스위치를 파이썬 인터프리터에 제공하거나 PYTHONDONTWRITEBYTECODE 환경 변수를 설정하여, 파이썬이 .pyc`나 :file:.pyo` 파일을 쓰는 것을 방지할 수 있습니다. 이 설정은 sys.dont_write_bytecode 변수로 파이썬 프로그램에 제공되며, 파이썬 코드는 이 값을 변경하여 인터프리터의 동작을 수정할 수 있습니다. (Neal Norwitz와 Georg Brandl 기여.)
표준 입력, 출력 및 표준 오류에 사용되는 인코딩은 인터프리터를 실행하기 전에 PYTHONIOENCODING 환경 변수를 설정하여 지정할 수 있습니다. 값은 <encoding> 또는 <encoding>:<errorhandler> 형식의 문자열이어야 합니다. encoding 부분은 인코딩 이름(예: utf-8 또는 latin-1)을 지정하며, 선택적 errorhandler 부분은 인코딩으로 처리할 수 없는 문자로 무엇을 할지 지정해야 하며, “error”, “ignore” 또는 “replace” 중 하나여야 합니다. (Martin von Löwis 기여.)
개선 및 신규 모듈¶
모든 릴리스와 마찬가지로, 파이썬 표준 라이브러리는 여러 개선 사항과 버그 수정 기능을 받았습니다. 가장 주목할 만한 변경점들을 모듈 이름에 따라 알파벳순으로 나열했습니다. 더 완전한 목록을 보려면 소스 트리의 Misc/NEWS 파일을 참조하거나 모든 세부 사항은 Subversion 로그를 확인하십시오.
asyncore및asynchat모듈이 다시 활발하게 유지 관리되고 있으며, 여러 패치와 버그 수정이 적용되었습니다. (Josiah Carlson 유지 보수; 하나는 bpo-1736190 참고.)bsddb모듈의 관리자가 Jesús Cea Avión으로 바뀌었으며, 이제 독립적인 패키지로 사용할 수 있습니다. 이 패키지에 대한 웹 페이지는 `www.jcea.es/programacion/pybsddb.htm <https://www.jcea.es/programacion/pybsddb.htm>`입니다. 계획은 해당 모듈의 릴리스 속도가 파이썬보다 훨씬 빠르기 때문에 Python 3.0에서 표준 라이브러리에서 제거하는 것입니다.bsddb.dbshelve모듈은 이제 프로토콜 1에 제한되는 대신 사용 가능한 가장 높은 피클링(pickling) 프로토콜을 사용합니다. (W. Barnes 기여.)cgi모듈은 이제 HTTP POST 요청의 쿼리 문자열에서 변수를 읽습니다. 이를 통해 “/cgi-bin/add.py?category=1”과 같이 쿼리 문자열을 포함하는 URL과 폼 액션(form action)을 사용하는 것이 가능해집니다. (Alexandre Fiori와 Nubis 기여; bpo-1817.)parse_qs`와 :func:`parse_qsl()함수는cgi모듈에서urlparse모듈로 재배치되었습니다. 여전히cgi모듈에 있는 버전은 2.6에서PendingDeprecationWarning메시지를 발생시킵니다 (bpo-600362).cmath모듈이 Mark Dickinson과 Christian Heimes의 기여로 대대적인 수정 작업을 거쳤습니다. 다섯 개의 새로운 함수가 추가되었습니다::func:`polar`은 복소수를 극좌표 형식으로 변환하여 해당 복소수의 크기(modulus)와 편각(argument)을 반환합니다.
:func:`rect`는 그 역과 같아서, 크기와 편각 쌍을 원래의 해당하는 복소수로 되돌립니다.
:func:`phase`는 복소수의 편각(angle이라고도 함)을 반환합니다.
:func:`isnan`은 인자의 실수부 또는 허수부 중 하나라도 NaN인 경우 True를 반환합니다.
:func:`isinf`는 인자의 실수부 또는 허수부 중 하나라도 무한대(infinite)인 경우 True를 반환합니다.
개정 사항은 또한
cmath모듈의 수치적 안정성을 개선했습니다. 모든 함수에 대해 결과의 실수부와 허수부는 가능한 경우 적은 정밀도 단위(ulps) 내에서 정확합니다. 상세 내용은 bpo-1381 을 참고하십시오.asinh(),atanh(), 및atan()에 대한 분기점도 수정되었습니다.모듈 테스트가 대폭 확장되어, 거의 2000개의 새로운 테스트 사례에서 대수 함수들을 사용합니다.
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 보다 커지지 않도록 제한됩니다. 가득 찬 deque에 더 많은 항목을 추가하면 오래된 항목이 폐기됩니다.>>> 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모듈에 새 창 메서드인 :meth:`chgat`이 추가되어, 단일 라인의 특정 개수 문자의 표시 속성을 변경할 수 있습니다. (Fabian Kreutz가 기여하였습니다.)# y=0, x=21부터 시작하여 해당 라인의 나머지 부분을 영향을 줍니다. stdscr.chgat(0, 21, curses.A_BOLD)
curses.textpad모듈의Textbox클래스는 이제 삽입 모드뿐만 아니라 덮어쓰기 모드의 편집을 지원합니다. 삽입 모드는Textbox인스턴스를 생성할 때 insert_mode 매개변수에 True 값을 제공하여 활성화할 수 있습니다.datetime모듈의strftime()메서드는 이제 객체의 마이크로초(microseconds) 수를 확장하는%f포맷 코드를 지원합니다. 이 값은 왼쪽 정렬하여 여섯 자리로 채워집니다. (Skip Montanaro가 기여하였습니다; bpo-1158).decimal모듈이 ‘The General Decimal Specification <https://speleotrove.com/decimal/decarith.html>’의 1.66 버전으로 업데이트되었습니다. 새로운 기능으로는exp`()및 :meth:`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`와 :meth:`storlines`는 이제 데이터가 전송된 후 각 데이터 블록과 함께 호출되는 선택적 *callback* 매개변수를 받습니다. (기여자 Phil Schwartz; :issue:`1221598().)내장 함수
reduce()는functools모듈에서도 사용할 수 있습니다. Python 3.0부터 내장 함수는 제외되었으며, 이제reduce()는 오직functools에서만 사용할 수 있습니다. 현재 2.x 시리즈에서는 내장 기능을 제거할 계획이 없습니다. (Christian Heimes가 패치했습니다; bpo-1739906.)가능한 경우,
getpass모듈은 이제 프롬프트 메시지를 출력하고 암호를 읽기 위해 :file:`/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)은 item 을 heap 에 푸시한 다음, 가장 작은 항목을 팝하여 반환합니다. 이는heappush()를 호출한 후heappop()을 별도로 호출하는 것보다 더 효율적입니다.heapq`는 이전의 보다-같거나-같음 비교 대신, 이제 보다-작음 비교만을 사용하도록 구현되었습니다. 이로 인해 :mod:`heapq`의 타입 사용 방식이 :meth:`list.sort메서드와 일치하게 됩니다. (기여자 Raymond Hettinger.)httplib.HTTPConnection및HTTPSConnection클래스 생성자에 선택적timeout매개변수(초 단위로 측정되는 시간제한)가 추가되었습니다. (추가자 Facundo Batista.)inspect모듈의getmoduleinfo()및 :func:`getargs`와 같은 대부분의 함수는 이제 네임드 튜플을 반환합니다. 튜플처럼 동작하는 것 외에도, 반환 값의 요소들은 속성으로 액세스할 수 있습니다. (기여자 Raymond Hettinger.)모듈에는
isgenerator(),isgeneratorfunction(), 및 :func:`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*가 True라면, 로그 파일 열기는 첫 번째 :meth:`emit호출이 이루어질 때까지 연기됩니다. (Vinay Sajip 기여.):class:`TimedRotatingFileHandler`에도 utc 생성자 매개변수가 있습니다. 이 인자가 True인 경우, 자정 발생 시점을 결정하고 파일 이름을 생성하는 데 UTC 시간이 사용되며, 그렇지 않으면 로컬 시간이 사용됩니다.
math모듈에 다음과 같은 새로운 함수들이 추가되었습니다:isinf()와isnan()는 각각 주어진 float가 (양의 무한대 또는 음의 무한대)인지 아니면 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 Hettinger, 그리고 Mark Dickinson 기여; :issue:`2819().):func:`~math.log1p``는 1+x*의 자연로그(밑 *e)를 반환합니다.
trunc()는 숫자를 0 방향으로 반올림하며, 함수의 인자와 0 사이의 가장 가까운Integral을 반환합니다. 이 기능은 `PEP 3141's type hierarchy for numbers <#pep-3141>` `를 백포팅하는 일부로 추가되었습니다.
math모듈은 부동 소수점 예외 처리 및 IEEE 754 특수 값 처리에 있어서 플랫폼 전반에 걸쳐 보다 일관된 동작을 제공하도록 개선되었습니다.가능한 경우, 이 모듈은 754의 특수 값에 대한 C99 표준의 권장 사항을 따릅니다. 예를 들어, ``sqrt(-1.)``는 이제 거의 모든 플랫폼에서
ValueError`를 발생시켜야 하며, 반면 ``sqrt(float('NaN'))``은 모든 IEEE 754 플랫폼에서 NaN을 반환해야 합니다. C99 표준의 부록 'F'가 '0으로 나누기' 또는 '잘못됨' 신호를 권장하는 경우, Python은 :exc:`ValueError`를 발생시킵니다. C99 표준의 부록 'F'가 '오버플로' 신호를 권장하는 경우, Python은 :exc:`OverflowError`를 발생시킵니다. (참고: :issue:`711019및 bpo-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`와 :func:`lchflags`는 해당 시스템 호출(사용 가능한 경우)의 래퍼로, 파일에 설정된 플래그를 변경합니다. 플래그 값에 대한 상수는 :mod:`stat()모듈에 정의되어 있으며, 일부 가능한 값에는 파일이 변경되지 않을 수 있음을 나타내는 :const:`UF_IMMUTABLE`과 데이터가 파일에 추가만 될 수 있음을 나타내는 :const:`UF_APPEND`가 포함됩니다. (M. Levinson 기여.)os.closerange(low, high)를 사용하면 low 부터 high 까지의 모든 파일 기술자를 효율적으로 닫고, 오류는 무시하며 high 자체는 포함하지 않습니다. 이 함수는 프로세스 시작을 더 빠르게 만들기 위해subprocess모듈에서 사용됩니다. (Georg Brandl 기여; bpo-1663329)clear()메서드를 사용하면 현재 객체의 키를 지우는 것 외에도os.unsetenv`를 사용하여 환경 변수를 제거합니다. (Martin Horcicka 기여; :issue:`1181())os.walk()함수에followlinks매개변수가 추가되었습니다. 이 값을 True로 설정하면 디렉터리를 가리키는 심볼릭 링크를 따라가고 해당 디렉터리의 내용을 방문합니다. 하위 호환성을 위해 기본값은 false입니다. 참고로, 심볼릭 링크가 부모 디렉터리를 가리킬 경우 무한 재귀에 빠질 수 있습니다. (bpo-1273829)os.path모듈에서splitext()함수가 더 이상 선행 점 문자(leading period characters)로 분할되지 않도록 변경되었습니다. 이는 유닉스 스타일의 점 파일(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모듈에서 제공하는 Python 디버거에 새로운 “run” 명령이 추가되었습니다. 이 명령은 디버깅 중인 Python 프로그램을 재시작하며, 선택적으로 프로그램의 새 명령줄 인수를 받을 수 있습니다. (Rocky Bernstein 기여; bpo-1393667)트레이스백 디버깅을 시작하는 데 사용되는
pdb.post_mortem()함수는 이제 트레이스백이 제공되지 않은 경우sys.exc_info`가 반환한 트레이스백를 사용합니다. (Facundo Batista 기여; :issue:`1106316())pickletools모듈에는 이제 피클을 포함하는 문자열을 받아 일부 사용하지 않는 오피코드(opcode)를 제거하고, 동일한 데이터 구조를 담고 있는 더 짧은 피클을 반환하는optimize()함수가 있습니다. (Raymond Hettinger 기여.)pkgutil모듈에 설치된 Python 패키지에 포함된 리소스 파일의 내용을 반환하는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)에 큐에 담긴 항목을 저장하고 우선순위 순서로 검색하며, :class:`LifoQueue`는 가장 최근에 추가된 항목부터 검색하여 스택처럼 동작합니다. (Raymond Hettinger 기여.)random모듈의Random객체는 이제 32비트 시스템에서 피클링하고 64비트 시스템에서 언피클링할 수 있으며, 그 역도 가능합니다. 아쉽게도 이 변경 사항은 Python 2.6의Random객체가 이전 버전에서는 올바르게 언피클링될 수 없다는 것을 의미하기도 합니다. (Shawn Ligocki 기여; bpo-1727780)triangular(low, high, mode)함수는 삼각 분포를 따르는 난수를 반환합니다. 반환되는 값은 low 와 high 사이의 값이지만 high 자체는 포함하지 않으며, mode 가 분포에서 가장 자주 발생한 값입니다. (Wladmir van der Laan 및 Raymond Hettinger 기여; bpo-1681432.)re모듈이 실행하는 정규 표현식 검색은 신호 전달 여부를 확인하므로, 시간이 오래 걸리는 검색을 이제 중단할 수 있습니다. (Josh Hoyt 및 Ralf Schmitt 기여; bpo-846388.)정규 표현식 모듈은 작은 정규식 전용 가상 머신을 위한 바이트코드를 컴파일하여 구현되었습니다. 신뢰할 수 없는 코드는 악의적인 바이트코드 문자열을 직접 생성하여 충돌을 일으킬 수 있으므로, Python 2.6에는 정규식 바이트코드 검증기(verifier)가 포함되어 있습니다. (Google App Engine 업무를 한 Guido van Rossum 기여; 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 스타일 패턴을 받으며, 주어진 모든 패턴과 일치하는 모든 파일 및 디렉터리를 무시할 콜러블을 반환합니다. 다음 예제는 디렉터리 트리를 복사하지만, 이름이 '~'으로 끝나는 :file:().svn` 디렉터리와 Emacs 백업 파일은 건너<0xEB><0x9C><0x81>니다.: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()도 있습니다.이벤트 루프는 파이프를 열어 읽기 전용 및 쓰기 전용의 두 개의 기술자를 생성하여 이를 사용합니다. 쓰기 가능한 기술자는
set_wakeup_fd`에 전달되고, 읽기 가능한 기술자는 :c:func:()!select` 또는 :c:func:`!poll`을 통해 이벤트 루프가 모니터링하는 기술자 목록에 추가됩니다. 시그널을 받으면 바이트가 기록되고 주 이벤트 루프는 깨어나서 폴링할 필요가 없습니다.(Adam Olsen 기여; bpo-1583.)
siginterrupt()함수는 이제 Python 코드에서 사용 가능하며, 시그널이 시스템 호출을 중단할 수 있는지 여부를 변경할 수 있습니다. (Ralf Schmitt 기여.)setitimer()및getitimer()함수도 추가되었습니다(사용 가능한 경우).setitimer`는 지정한 시간(벽시계 시간, 소비된 프로세스 시간 또는 합산 프로세스+시스템 시간으로 측정)이 지난 후 해당 프로세스로 시그널을 발생시키도록 간격 타이머를 설정할 수 있습니다. (Guilherme Polo 기여; :issue:`2240().)The
smtplibmodule now supports SMTP over SSL thanks to the addition of theSMTP_SSLclass. This class supports an interface identical to the existingSMTPclass. (Contributed by Monty Taylor.) Both class constructors also have an optionaltimeoutparameter that specifies a timeout for the initial connection attempt, measured in seconds. (Contributed by Facundo Batista.)또한, 모듈에 LMTP 프로토콜(RFC 2033) 구현이 추가되었습니다. LMTP는 메일 큐를 관리하지 않는 에이전트 간 이메일 전송 시 SMTP 대신 사용됩니다. (Leif Hedstrom 기여; 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, ...)`()대신 :func:`create_connection`을 사용하도록 변경하는 것만으로도 IPv6에서 코드가 작동할 수 있게 될 수도 있습니다.SocketServer모듈의 기본 클래스들은 이제 서버의timeout속성에 의해 지정된 유휴 시간 경과 후에handle_timeout()메서드를 호출하는 것을 지원합니다. (Michael Pomraning 기여). 또한,serve_forever()메서드는 이제 선택적 폴링 간격을 초 단위로 받아 서버가 종료 요청을 확인하는 빈도를 제어합니다. (Pedro Werneck 및 Jeffrey Yasskin 기여; bpo-742598, bpo-1193577.)Gerhard Häring이 관리하는
sqlite3모듈은 Python 2.5의 버전 2.3.2에서 버전 2.4.1로 업데이트되었습니다.struct모듈이 이제 형식 문자'?'을 사용하여 C99 _Bool 타입을 지원합니다. (David Remahl 기여.)The
Popenobjects provided by thesubprocessmodule now haveterminate(),kill(), andsend_signal()methods. On Windows,send_signal()only supports theSIGTERMsignal, and all these methods are aliases for the Win32 API functionTerminateProcess(). (Contributed by Christian Heimes.)sys모듈의 새로운 변수인float_info`는 플랫폼의 부동 소수점 지원에 대한 정보가 담긴, :file:`float.h파일에서 파생된 객체입니다. 이 객체의 속성에는mant_dig(가수수의 자릿수),epsilon(1.0과 표현 가능한 다음으로 큰 값 사이의 가장 작은 차이) 등 여러 가지가 포함됩니다. (Christian Heimes 기여; bpo-1534.)또 다른 새로운 변수인
dont_write_bytecode`는 파이썬이 모듈을 임포트할 때 어떠한 :file:.pyc` 또는.pyo파일을 작성하는지를 제어합니다. 이 값이 참이면 컴파일된 파일은 작성되지 않습니다. 이 변수는 인터프리터에-B스위치를 제공하거나, 인터프리터를 실행하기 전에PYTHONDONTWRITEBYTECODE환경 변수를 설정하여 시작 시점에 초기 설정됩니다. 파이썬 코드는 이후 해당 변수의 값을 변경하여 바이트코드 파일의 작성 여부를 제어할 수 있습니다. (Neal Norwitz 및 Georg Brandl 기여.)Python 인터프리터에 제공된 명령줄 인수에 대한 정보는
sys.flags로 사용 가능한 이름 지정 튜플의 속성을 읽어 사용할 수 있습니다. 예를 들어,verbose속성은 Python이 상세 모드에서 실행되었는지 여부를 나타내며,debug은 디버깅 모드를 의미합니다. 이 모든 속성은 읽기 전용입니다(Christian Heimes 제공).새 함수인
getsizeof`는 Python 객체를 받아 해당 객체가 사용하는 메모리 양을 바이트 단위로 반환합니다. 내장 객체는 올바른 결과를 반환하며, 타사 확장 기능은 그렇지 않을 수 있지만, 객체의 크기를 반환하는 :meth:`__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)
새로운
encoding및errors매개변수는 문자 변환에 대한 인코딩과 오류 처리 방식을 지정합니다.'strict','ignore','replace'는 Python이 오류를 처리하는 세 가지 표준 방법이며,'utf-8'은 bad 문자를 해당 UTF-8 표현으로 대체하는 특수 값입니다. (문자 변환은 PAX 형식이 유니코드 파일 이름을 지원하여 기본적으로 UTF-8 인코딩을 사용하기 때문에 발생합니다.)TarFile.add()메서드는 아카이브에서 특정 파일 이름을 제외하는 데 사용될 수 있는 함수인exclude인자를 이제 받습니다. 이 함수는 파일 이름 하나를 받아, 해당 파일을 제외해야 하는 경우 true를 반환하거나 아카이브에 보관해야 하는 경우 false를 반환해야 합니다. 이 함수는 :meth:`add`에 처음에 전달된 이름과 재귀적으로 추가되는 디렉터리에 있는 파일 이름 모두에 적용됩니다.(모든 변경 사항은 Lars Gustäbel이 기여함).
선택적
timeout매개변수가telnetlib.Telnet클래스 생성자에 추가되어, 초 단위로 측정되는 시간 제한을 지정합니다(Facundo Batista 추가).tempfile.NamedTemporaryFile클래스는 일반적으로 파일이 닫힐 때 생성한 임시 파일을 삭제합니다. 이제 생성자에delete=False를 전달하여 이 동작을 변경할 수 있습니다(Damien Miller 기여; bpo-1537850).새로운 클래스인 :class:`SpooledTemporaryFile`은 임시 파일처럼 작동하지만 최대 크기를 초과할 때까지 데이터를 메모리에 저장합니다. 이 한계에 도달하면, 내용은 디스크의 임시 파일에 기록됩니다(Dustin J. Mitchell 기여).
NamedTemporaryFile및SpooledTemporaryFile클래스는 모두 컨텍스트 관리자로 작동하므로,with tempfile.NamedTemporaryFile() as tmp: ...와 같이 사용할 수 있습니다(Alexander Belopolsky 기여; bpo-2021).test.test_support모듈은 테스트 작성을 유용한 컨텍스트 관리자를 다수 얻게 되었습니다. :func:`~test.support.os_helper.EnvironmentVarGuard`는 환경 변수를 임시로 변경하고 자동으로 이전 값으로 복원하는 컨텍스트 관리자입니다.또 다른 컨텍스트 관리자인 :class:`TransientResource`는 존재할 수도 있고 아닐 수도 있는 리소스 호출을 감쌀 수 있으며, 지정된 예외 목록을 포착하고 무시합니다. 예를 들어, 네트워크 테스트는 외부 웹 사이트 연결 시 특정 실패를 무시할 수 있습니다:
with test_support.TransientResource(IOError, errno=errno.ETIMEDOUT): f = urllib.urlopen('https://sf.net') ...
마지막으로,
check_warnings`은 :mod:`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가 :issue:`1581073`에서 기여함.)
threading모듈의 API는 이제setDaemon()및isDaemon()메서드 대신daemon`과 같은 속성을 사용하도록 변경되었으며, 일부 메서드는 카멜 케이스 대신 밑줄(underscore)을 사용하도록 이름이 변경되었습니다. 예를 들어, :meth:`activeCount메서드는 :meth:`active_count`로 이름이 바뀌었습니다. 모듈의 2.6 및 3.0 버전 모두 동일한 속성과 이름이 변경된 메서드를 지원하지만, 이전 메서드는 제거되지 않습니다. Python 3.x에서 레거시 API에 대한 폐기 예정 날짜는 설정되지 않았으며, 이전 API는 어떤 2.x 버전에서도 제거되지 않을 것입니다. (여러 사람이 수행했으며, 특히 Benjamin Peterson.)threading모듈의Thread객체에 스레드의 식별자(nonzero integer)를 반환하는ident속성이 추가되었습니다. (Gregory P. Smith가 기여함; bpo-2871.)timeit모듈은 이제 타이밍 대상 구문(statement)과 설정 코드(setup code) 모두에 문자열뿐만 아니라 호출 가능한 객체(callables)도 허용합니다.Timer인스턴스를 생성하기 위해 두 가지 편의 함수(repeat(stmt, setup, time, repeat, number))와 timeit(stmt, setup, time, number)`가 추가되었습니다. 이들은 각각 대응하는 메서드를 호출하여 인스턴스를 생성합니다. (Erik Demaine이 기여함; :issue:`1533909.)Tkinter모듈은 옵션으로 리스트와 튜플을 허용하며, 요소를 공백으로 분리한 후 그 결과를 Tcl/Tk에 전달합니다. (Guilherme Polo가 기여함; bpo-2906.)터틀 그래픽용
turtle모듈이 Gregor Lingl에 의해 크게 향상되었습니다. 새로운 기능은 다음과 같습니다:거북이 움직임과 회전의 개선된 애니메이션 처리.
새로운
delay(),tracer(), 및speed()메서드를 사용한 거북이 움직임 제어 기능.거북이를 위한 새로운 모양을 설정하고, 새로운 좌표계를 정의할 수 있는 기능.
터틀에 어떠한 행동도 되돌릴 수 있는
undo()메서드가 생겼습니다.마우스 및 키보드 활동과 같은 입력 이벤트에 반응하는 간단한 지원을 추가하여, 간편하게 게임 작성이 가능해졌습니다.
}:file:turtle.cfg 파일을 사용하여 터틀 화면의 초기 모양을 사용자 정의할 수 있습니다.
모듈의 독스트링은 다른 언어로 번역된 새로운 독스트링으로 대체될 수 있습니다.
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`과 :func:`showwarning`에 선택적 *line* 인자가 추가되었으며, 이를 사용하여 소스 코드의 줄을 제공할 수 있습니다. (이는 :mod:`warnings()모듈의 일부를 C 코드로 재구현한 :issue:`1631171`에 포함되었습니다.)새로운 함수인
catch_warnings`는 테스트 목적으로 사용되는 컨텍스트 관리자로, 경고 필터를 일시적으로 수정하고 원래 값으로 복원할 수 있게 해줍니다. (:issue:`3781().)The XML-RPC
SimpleXMLRPCServerandDocXMLRPCServerclasses can now be prevented from immediately opening and binding to their socket by passingFalseas the bind_and_activate constructor parameter. This can be used to modify the instance’sallow_reuse_addressattribute before calling theserver_bind()andserver_activate()methods to open the socket and begin listening for connections. (Contributed by Peter Parente; bpo-1599845.)SimpleXMLRPCServer`는 또한 :attr:`_send_traceback_header속성을 가지고 있습니다. 이 값이 true이면, 예외와 형식화된 트레이스백이 “X-Exception” 및 “X-Traceback” HTTP 헤더로 반환됩니다. 이 기능은 디버깅 목적으로만 사용해야 하며 비밀번호나 기타 민감한 정보를 노출할 수 있으므로 프로덕션 서버에서는 사용해서는 안 됩니다. (Alan McIntyre가 Google의 Summer of Code 2007 프로젝트의 일환으로 기여함.)xmlrpclib모듈은 더 이상datetime.date및datetime.time을 다음의xmlrpclib.DateTime타입으로 자동 변환하지 않습니다; 이 변환 의미론은 모든 애플리케이션에 대해 반드시 정확한 것은 아닙니다.xmlrpclib를 사용하는 코드는date및time인스턴스를 변환해야 합니다. (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 모듈은 파이썬 코드의 추상 구문 트리(Abstract Syntax Tree) 표현을 제공하며, 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를 인수로 받아 파싱하고 평가하여 결과 값을 반환합니다. 리터럴 표현식이란 문 또는 함수 호출이 아닌 문자열, 숫자, 딕셔너리 등으로 구성된 파이썬 표현식입니다. 표현식은 평가해야 하지만 eval() 호출의 보안 위험을 감수할 수 없는 경우, :func:`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를 순회하고 수정하기 위한 NodeVisitor 및 NodeTransformer 클래스와 라인 번호 변경과 같은 일반적인 변환을 위한 함수도 포함되어 있습니다.
future_builtins 모듈¶
Python 3.0은 내장 함수의 레퍼토리에 많은 변경을 가했고, 그 변화 중 대부분은 호환성을 깨뜨리기 때문에 Python 2.x 시리즈에서는 도입할 수 없습니다. future_builtins 모듈은 3.0과 호환되는 코드를 작성할 때 가져올 수 있는 이러한 내장 함수의 버전을 제공합니다.
이 모듈의 함수들은 현재 다음과 같습니다:
ascii(obj): :func:`repr`과 동일합니다. Python 3.0에서는 :func:`repr`가 유니코드 문자열을 반환하는 반면, :func:`ascii`는 순수 ASCII 바이트스트링을 반환합니다.filter(predicate, iterable),map(func, iterable1, ...): 3.0 버전은 반복자(iterator)를 반환하여, 리스트를 반환하는 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를 참조하세요.
:mod:`json`은 대부분의 내장 파이썬 타입을 디코딩 및 인코딩하는 기능을 지원합니다. 다음 예시는 딕셔너리를 인코딩하고 디코딩합니다:
>>> import json
>>> data = {"spam": "foo", "parrot": 42}
>>> in_json = json.dumps(data) # 데이터를 인코딩합니다
>>> in_json
'{"parrot": 42, "spam": "foo"}'
>>> json.loads(in_json) # Python 객체로 디코딩합니다
{"spam": "foo", "parrot": 42}
더 많은 유형을 지원하기 위해 자체 디코더 및 인코더를 작성하는 것도 가능합니다. JSON 문자열의 보기 좋게 출력(pretty-printing) 기능도 지원됩니다.
json (원래 simplejson이라고 불렸습니다)는 Bob Ippolito가 작성했습니다.
plistlib 모듈: 속성 리스트 파서 (Property-List Parser)¶
.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() 메서드를 지원합니다. :meth:`from_buffer_copy`는 객체의 내용을 복사하며, :meth:`from_buffer`는 동일한 메모리 영역을 공유합니다.
새로운 호출 규약은 ctypes`에게 래핑된 각 호출이 시작될 때 ``errno` 또는 Win32 LastError 변수를 지우도록 지시합니다. (Thomas Heller 구현; bpo-1798.)
이제 함수 호출 후 Unix 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은 새로운 모듈 ssl 을 추가하여 Python 2.6의 Secure Sockets Layer 지원에 광범위한 개선을 이루었습니다. 이 모듈은 OpenSSL 라이브러리를 기반으로 구축되었습니다. 이 새 모듈은 협상되는 프로토콜, 사용된 X.509 인증서에 대한 더 많은 제어를 제공하며, Python에서 SSL 서버(클라이언트가 아닌)를 작성하는 것에 대한 지원이 향상되었습니다. socket 모듈의 기존 SSL 지원은 제거되지 않았으며 계속 작동하지만, Python 3.0에서는 제거될 예정입니다.
To use the new module, you must first create a TCP connection in the
usual way and then pass it to the ssl.wrap_socket() function.
It’s possible to specify whether a certificate is required, and to
obtain certificate info by calling the getpeercert() method.
더 보기
ssl 모듈에 대한 문서입니다.
폐지 및 제거 항목¶
문자열 예외가 제거되었습니다. 이를 사용하려고 하면 :exc:`TypeError`가 발생합니다.
PEP 352 에 의해 지정된
Exception인터페이스의 변경사항은 계속되고 있습니다. 2.6 버전에서는message속성이args속성으로 폐지됩니다.(3.0-warning 모드) Python 3.0은 오래된 많은 모듈을 제거하고 다른 모듈의 이름을 바꾸는 재구성된 표준 라이브러리를 특징으로 할 것입니다. 3.0-warning 모드로 실행되는 Python 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
posixfilemodule has been deprecated;fcntl.lockf()provides better locking.popen2모듈이 폐지되었으므로subprocess모듈을 사용하십시오.rgbimg모듈이 제거되었습니다.sha모듈이 폐지되었으므로 대신hashlib모듈을 사용하십시오.
빌드 및 C API 변경 사항¶
파이썬의 빌드 프로세스와 C API에 대한 변경 사항은 다음과 같습니다:
Python은 이제 C89 컴파일러(19년 만에!)로 컴파일되어야 합니다. 이는 파이썬 소스 트리가 C89 표준 라이브러리에 포함된
memmove`와 :c:func:()!strerror` 자체 구현을 제거했다는 것을 의미합니다.Python 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 updatesys.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 namedos.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 PEP 3118 section <#pep-3118-revised-buffer-protocol>`에 설명되었던 새로운 버퍼 인터페이스는 :c:func:`PyObject_GetBuffer`와 :c:func:`PyBuffer_Release`를 포함하여 몇 가지 다른 함수들을 추가합니다.
Python의 C stdio 라이브러리 사용은 이제 스레드 안전하며, 적어도 해당 기반 라이브러리가 스레드 안전인 수준만큼입니다. 한 스레드가 파일 객체를 닫는 동안 다른 스레드가 해당 객체에서 읽거나 쓰는 경우에 발생했던 오랫동안 잠재되어 온 버그가 있었습니다. 2.6에서는 파일 객체가
PyFile_IncUseCount`와 :c:func:()!PyFile_DecUseCount` 함수에 의해 참조 카운트를 갖습니다. 객체의 참조 카운트가 0이 아니면 파일 객체는 닫을 수 없습니다. :c:func:!PyFile_IncUseCount`는FILE *포인터를 사용하여 I/O 작업을 수행하기 전에 GIL이 여전히 보유된 상태에서 호출해야 하며, :c:func:`!PyFile_DecUseCount`는 GIL 재획득 직후에 호출해야 합니다. (Antoine Pitrou 및 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.)Python의 C API에는 대소 문자 구분 없는 문자열 비교를 위한 두 가지 함수,
PyOS_stricmp(char*, char*)와PyOS_strnicmp(char*, char*, Py_ssize_t)가 포함됩니다. (Christian Heimes 기여; bpo-1635.)많은 C 확장 프로그램들은
init*함수에서 모듈의 딕셔너리에 정수와 문자열을 추가하기 위한 자체 작은 매크로를 정의합니다. Python 2.6에서는 마침내 :c:macro:`PyModule_AddStringMacro`와 :c:macro:`PyModule_AddIntMacro()`가 값 추가를 위한 표준 매크로를 정의했습니다. (Christian Heimes 기여.)몇 가지 매크로는 3.0 및 2.6 모두에서 함수가 아니라 매크로임을 명확히 하기 위해 이름이 변경되었습니다.
Py_Size()는Py_SIZE()가 되었고,Py_Type()은Py_TYPE()이 되었으며,Py_Refcnt()는Py_REFCNT()가 되었습니다. 혼합 케이스 매크로는 여전히 이전 버전 호환성을 위해 Python 2.6에서 사용할 수 있습니다. (bpo-1629)Distutils는 이제 Python의 디버그 버전을 실행할 때 C 확장 프로그램을 다른 디렉토리에 배치합니다. (Collin Winter 기여; bpo-1530959.)
정수와 문자열과 같은 여러 기본 데이터 타입은 재사용할 수 있는 객체의 내부 자유 목록을 유지합니다. 이 자유 목록들을 위한 자료 구조는 이제 이름 규칙을 따릅니다: 변수는 항상
free_list로, 카운터는 항상numfree로, 그리고 매크로는 항상Py<typename>_MAXFREELIST가 정의됩니다.새로운 Makefile 타겟인 “make patchcheck”은 패치를 만들 수 있도록 파이썬 소스 트리를 준비합니다. 이 과정에서는 수정된 모든
.py파일의 후행 공백을 수정하고, 문서가 변경되었는지 확인하며,Misc/ACKS`와 :file:`Misc/NEWS파일이 업데이트되었는지 보고합니다. (Brett Cannon 기여.)또 다른 새로운 타겟인 “make profile-opt”는 GCC의 프로파일 가이드 최적화(profile-guided optimization)를 사용하여 파이썬 바이너리를 컴파일합니다. 이 스크립트는 프로파일링을 활성화하여 파이썬으로 컴파일하고, 테스트 스위트를 실행하여 프로파일링 결과 세트를 얻은 다음, 이 결과를 사용하여 최적화 컴파일을 수행합니다. (Gregory P. Smith 기여.)
포트별 변경 사항: Windows¶
Windows 95, 98, ME 및 NT4에 대한 지원이 중단되었습니다. Python 2.6은 최소 Windows 2000 SP4가 필요합니다.
새 기본 컴파일러는 Visual Studio 2008 (버전 9.0)입니다. Visual Studio 2003 (버전 7.1) 및 2005 (버전 8.0)의 빌드 디렉터리는 PC/ 디렉터리로 이동되었습니다. 새로운
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 <winreg>`는 x64 시스템에 대해서도 개선된 지원을 제공하여, 64비트 시스템에서 실행되는 32비트 프로세스의 레지스트리 리플렉션을 활성화 및 비활성화하는 :func:`~winreg.DisableReflectionKey,EnableReflectionKey(), 및QueryReflectionKey()함수를 노출합니다. (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에서 제거될 예정입니다: al 및 AL, cd, cddb, cdplayer, CL 및 cl, DEVICE, ERRNO, FILE, FL 및 fl, flp, fm, GET, GLWS, GL 및 gl, IN, IOCTL, jpeg, panelparser, readcd, SV 및 sv, torgb, videoreader, 그리고 WAIT.
파이썬 2.6으로 이식하기¶
본 섹션은 코드 변경이 필요할 수 있는 이전에 설명한 변경 사항과 기타 버그 수정 사항을 나열합니다:
해시 가능하지 않아야 하는 클래스는 해당 사실을 나타내기 위해 정의에
__hash__ = None을 설정해야 합니다.문자열 예외가 제거되었습니다. 이를 사용하려고 하면 :exc:`TypeError`가 발생합니다.
collections.deque의__init__()메서드는 이제 반복 가능한(iterable) 요소들을 추가하기 전에 덱에 존재하는 모든 내용을 지웁니다. 이 변경으로 인해 동작이list.__init__()과 일치하게 되었습니다.object.__init__`은 이전에는 임의의 인자 및 키워드 인자를 받고 이를 무시했습니다. Python 2.6에서는 이것이 더 이상 허용되지 않으며 :exc:`TypeError`를 발생시킵니다. 이는 결국 :class:`object`에서 해당 메서드를 호출하는 :meth:`__init__()메서드에 영향을 미칠 것입니다(아마도super()사용을 통해). 논의는 :issue:`1683368`을 참고하십시오.Decimal생성자는 이제 문자열을 전달받을 때 앞뒤 공백을 허용합니다. 이전에는InvalidOperation예외가 발생했습니다. 반면에,Context객체의create_decimal()메서드는 이제 추가 공백을 명시적으로 허용하지 않으며,ConversionSyntax예외를 발생시킵니다.구현상 실수로 인해 내장 함수 :func:`__import__`에 파일 경로를 전달하면 실제로는 지정된 파일을 가져왔습니다. 하지만 이것은 원래 의도된 동작이 아니었으며, 이제 구현은 이 경우를 명시적으로 확인하고 :exc:`ImportError`를 발생시킵니다.
C API:
PyImport_Import()및PyImport_ImportModule()함수는 이제 상대 가져오기(relative imports)가 아닌 절대 가져오기(absolute imports)를 기본값으로 사용합니다. 이는 다른 모듈을 가져오는 C 확장 프로그램에 영향을 미칩니다.C API: 해시 가능해서는 안 되는 확장 데이터 유형은 해당
tp_hash슬롯을 :c:func:`PyObject_HashNotImplemented`로 정의해야 합니다.socket모듈 예외socket.error`가 이제 :exc:`IOError`로부터 상속받습니다. 이전에는 :exc:`StandardError`의 서브클래스가 아니었지만, 이제는 :exc:`IOError`를 통해 그러합니다. (Gregory P. Smith 구현; :issue:`1706815.)xmlrpclib모듈은 더 이상datetime.date및datetime.time`을 :class:`xmlrpclib.DateTime유형으로 자동으로 변환하지 않습니다; 해당 변환 의미론이 모든 애플리케이션에 필연적으로 정확하지는 않았습니다.xmlrpclib`를 사용하는 코드는 :class:`date및time인스턴스를 변환해야 합니다. (bpo-1330538)(:3.0 경고 모드) 이제
Exception클래스는 슬라이싱 또는 인덱스 접근을 사용하여 액세스할 때 경고를 표시합니다. :class:`Exception`이 튜플처럼 동작하는 것은 점진적으로 사라지고 있습니다.(:3.0 경고 모드) 두 개의 딕셔너리 또는 비교 메서드를 구현하지 않는 두 객체 간의 부등식 비교는 경고로 보고됩니다.
dict1 == dict2는 여전히 작동하지만,dict1 < dict2는 점진적으로 사라지고 있습니다.파이썬 스코핑 규칙의 구현 세부 사항인 셀 간 비교도 경고를 발생시키는데, 이는 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.