Python 3.5 미리보기: 무엇이 바뀌었고 무엇이 추가되었나?

사용자 삽입 이미지

이 포스팅은 파이썬 3.5.0b3(3.5.0 beta3) 버전을 기준으로 작성되었습니다. 정식 릴리즈 버전과 큰 차이는 없는 것으로 보이나 시간이 된다면 후에 stable 릴리즈 버전에 맞춰 글을 수정하도록 하곘습니다.

원문은 이 곳입니다. 글에도 나와있듯 3.4에서 3.5로 넘어갈 때의 차이점만을 작성합니다. 전체 변동사항을 확인하고 싶다면 여기서 확인하시면 됩니다. 본인이 제대로 이해하지 못한 부분은 번역이 일부 누락되어 있을 수도 있습니다. 언제든지 제안 환영합니다.

일부 추가가 필요하다고 생각되는 내용 또한 추가시켰습니다.

 

한 절반 정도 쓰다가 멘붕이 와서 절반 이후로는 엉망일 수도 있습니다. 지적 바랍니ㄷ..

 

Release highlight

다음 새로운 문법을 지원합니다:

  • PEP 465: 새로운 matrix multiplication(행렬 곱) 연산자를 지원합니다. - a @ b
  • PEP 492: async, await 문법을 이용한 코루틴 사용이 가능합니다.

 

다음 새로운 라이브러리 모듈을 제공합니다:

  • zipapp: 파이썬에서의 ZIP 압축 지원 향상을 위해 제공합니다. (PEP 441)

 

다음 새로운 빌트-인(내장)이 추가되었습니다:

  • PEP 461: % 포맷팅(formatting)에서 bytes 및 bytearray를 지원합니다.
  • Issue 9951: bytes, bytearray, memoryview에 hex() 메소드가 추가되었습니다. 바이트 배열을 바로 hex string으로 변환할 수 있게 되었습니다.
  • 제너레이터(Generator)는 gi_yieldfrom 속성을 가지게 되었습니다. 이 속성은 yield from 구문을 통해 이터레이션 될 수 있는 객체를 반환합니다.
  • RecursionError 예외가 추가되었습니다.

 

다음 구현부가 개선되었습니다:

  • LC_TYPE 로케일이 POSIX 로케일(C)일 경우, sys.stdin 및 sys.stdout은 strict 오류 핸들러 대신에 surrogateescape 에러 핸들러를 사용합니다.
  • PEP 488: .pyo 파일의 제거.
  • PEP 489: Multi-phase initialization of extension modules

 

다음 라이브러리 모듈이 크게 향상되었습니다:

  • collections.OrderedDict가 C로 구현되어 4배에서 100배까지 성능이 더 향상되었습니다. issue 16991에서 Eric Snow님이 기여해주셨습니다.
  • 이제 bytes를 tempfile 모듈의 API로 넘길 수 있게 되었으며, 임시 파일명을 str대신에 bytes로 리턴합니다. gettempdirb(), gettempprefixb() 함수가 추가되었습니다. 기존의 함수들과 동일하나 bytes로 리턴합니다.

 

개선된 보안 관련 사항은 아직 없습니다.

PEP 492 - 코루틴 with async, await 문법

코루틴을 선언하는 전용 문법이 생겼습니다: async for, async with.

예시:

 

Yury Selivanov에 의해 PEP가 작성, 구현되었습니다.

도보시오: PEP 492 - Coroutines with async and await syntax

꼭보시오: Python 3, asyncio와 함께 놀아보기! (coroutine을 이용한 async 지원은 이미 Python 3.4에서 지원되고 있습니다. 새로 생긴 것이 아니고 단지 전용 문법이 생긴 것입니다.)

 

PEP 448 - 추가된 값 언팩(unpack) 방법

새로운 값 언팩 방법이 생겼습니다.

다음과 같은 일들이 가능해집니다:

 

도보시오: PEP 488 - Additional Unpacking Generializations

 

PEP 461 - bytes 와 bytearray 의 포매팅 지원

이 PEP는 Python 2의 str 타입과 동일하게 bytes, bytearray에 대한 포매팅을 제안합니다.

예시:

%s에 유니코드는 허용되지 않습니다, 하지만 %a를 통해 허용됩니다. (repr(obj).encode('ascii', 'backslashreplace') 와 동일)

 

도보시오: PEP 461 - Adding % formatting to bytes and bytearray

 

PEP 465 - matrix multiplication(행렬 곱)을 위한 전용 오퍼레이터

이 PEP는 @라고 불리는 새로운 바이너리 오퍼레이터를 제안합니다. 이 오퍼레이터는 행렬의 곱을 위해 사용됩니다.

(참고: 데코레이터는 @가 가장 앞에 오기 때문에 충돌은 없습니다.)

 

도보시오: PEP 465 - A dedicated infix operator for matrix multiplication

 

PEP 471 - os.scandir() 함수 - 더 좋고 빠른 디렉토리 이터레이터

PEP 471은 os.scandir() 이라는 새로운 디렉토리 이터레이션 함수를 파이썬 표준 라이브러리에 추가합니다. 추가로, os.walk() 함수는 이제 os.scandir() 을 이용해 구현됩니다. 이는 POSIX 시스템에서 3-5배의 속도 향상, Windows 시스템에서 7-20배의 속도 향상을 가져옵니다.

 

Ben Hoyt(with the help of Victor Stinner)에 의해 PEP가 작성, 구현되었습니다.

도보시오: PEP 471 - os.scandir() function - a better and faster directory iterator

 

PEP 475 - EINTR 오류로 발생한 시스템 콜에 대한 자동 재시도

PEP 475는 EINTR 오류로 발생한 시스템 콜의 자동 재시도에 대한 지원을 추가합니다. 이것이 의미하는 것은 개발자가 EINTR 또는 InterruptError를 직접적으로 다룰 필요가 없어졌다는 점입니다.

 

도보시오: PEP 475 - Retry system calls failing with EINTR

 

PEP 479 - 제너레이터 안에서의 StopIteration 핸들링 방법 변경

PEP 479는 다음 제너레이터의 동작을 변경합니다: 제너레이터 안에서 StopIteration 예외가 발생했을 경우, 해당 예외는 자동으로 RuntimeError로 변경됩니다. 이 기능을 활성화하기 위해 다음 __future__ 구문을 추가하면 됩니다:

__future__ 구문을 추가하지 않는다면, PendingDeprecationWarning 예외가 발생합니다.

 

Chris Angelico와 Guido van Rossum에 의해 PEP가 쓰여졌고, Chris Angelico, Yury Selivanov, Nick Coghlan에 의해 구현되었습니다.

도보시오: PEP 479 - Change StopIteration handling inside generators

 

PEP 486: 파이썬 런쳐가 자동으로 virtualenv를 인식

PEP 486은 윈도우 파이썬 런쳐(PEP 397 참고)가 활성화된 virtualenv를 자동으로 인식하게 합니다. 기본 인터프리터가 실행됐고 VIRTUAL_ENV 환경변수가 설정되어 있다면 virtualenv에 있는 인터프리터가 실행됩니다.

 

도보시오: PEP 486 - Make the Python Launcher aware of virtual environments

 

PEP 488 - PYO 파일의 제거

PEP 488은 .pyo 파일을 버립니다. 이것이 의미하는 것은 .pyc 파일은 최적화되지 않은 바이트코드와 최적화된 바이트코드 모두를 포함하게 됩니다. 이를 방지하기 위해서는 지속적으로 바이트코드를 생성해야 하는데, 바이트코드가 최적화될 때 opt- 라는 태그가 붙은 .pyc 파일들도 같이 생성됩니다. -O-OO붙여 돌릴 경우에는 더 이상 바이트코드 파일 이름이 충돌되지 않는다는 문제가 있습니다. 따라서, -O-OO로 생성된 바이트코드 파일은 동시에 존재할 수 있습니다. importlib.util.cache_from_source() 함수는 이 변경을 지원하기 위해 API가 업데이트 되었습니다.

 

도보시오: PEP 488 - Eliminiation of PYO files

 

PEP 489 - Multi-phase extension module initialization

(TBW) 뭔지 잘 모르겠습니다. ㅠㅠ 댓글로 제보 받습니다.

 

PEP 485: 테스트 오차 검증을 위한 함수

PEP 485는 math.isclose()cmath.isclose() 함수를 추가합니다. 이는 인자로 넘어온 두 값이 거의 일치하는지 아니면 얼마나 가까운지(근사값)를 알려줍니다. 

 

도보시오: PEP 485 - A function for testing approximate equality

 

다른 언어적인 변경

파이썬 코어의 소소한 변경점들은 다음과 같습니다:

  • "namereplace" 오류 핸들러가 추가되었습니다. "backslashreplace" 오류 핸들러는 decoding과 translating과 함께 동작합니다. (issue 19676, issue 22286에서 Serhiy Storchaka님이 기여해주셨습니다.)
  • -b 옵션은 bytes와 int를 비교할 때 영향을 미칩니다. (issue 23681에서 Serhiy Storchaka님이 기여해주셨습니다.)
  • 새로운 카자흐 코덱이 추가되었습니다: kz1048. (issue 22682에서 Serhiy Storchaka님이 기여해주셨습니다.)
  • docstrings 속성은 이제 writable 합니다. 이것은 특히 collections.namedtuple() 의 docstrings을 작성하는데 유용합니다. (issue 24064에서 Berker Peksag님이 기여해주셨습니다.)
  • 새로운 타지크 코덱이 추가되었습니다: koi8_t. (issue 22681에서 Serhiy Storchaka님이 기여해주셨습니다.)

 

새로운 모듈

zipapp (PEP 441)

새로운 zipapp 모듈은 실행 가능한 Python Zip 애플리케이션을 만드는데 사용할 수 있는 API와 커맨드 라인 툴을 제공합니다. 이것은 이미 파이썬 2.6의 issue 1739468에서 소개됐었으나 그 당시에는 제대로 공개되지 않았었습니다.

 

이 모듈을 이용하면, 엄청나게 쉽게 파이썬 애플리케이션을 빌드할 수 있게 됩니다. __main__.py 파일을 포함해 myapp 디렉토리에 넣고 다음과 같이 실행하면 됩니다:

$ python -m zipapp myapp

$ python myapp.pyz

 

개선된 모듈들

argparse

  • ArgumentParserallow_abbrev를 False로 설정함을 통해 긴 옵션(--help)을 줄여쓰는 것(-h)을 비활성화하는 것을 지원합니다. (Jonathan Paugh, Steven Bethard, paul j3, Daniel Eriksson님이 기여해주셨습니다.)

 

cgi

  • FieldStroage는 context management protocol을 지원합니다. (issue 20289에서 Berker Peksag님이 기여해주셨습니다.)

 

cmath

  • cmath.isclose() 함수가 추가되었습니다. (issue 24270에서 Chris Barker와 Tal Einat님이 기여해주셨습니다.)

 

code

  • code.InteractiveInterpreter.showtraceback() 메소드는 엮인 모든 스택 추적(stack traceback)을 출력합니다. interactive interpreter과 같이 말이죠. (issue 17442에서 Claudiu Popa님이 기여해주셨습니다.)

 

collections

  • collections.namedtuple()의 docstrings을 수정할 수 있게 되었습니다:

(issue 24064에서 Berker Peksag님이 기여해주셨습니다.)


compileall

  • compileall.compile_dir()compileall의 CLI는 병렬로 바이트코드 컴파일을 할 수 있게 되었습니다. (issue 16104에서 Claudiu Popa님이 기여해주셨습니다.)

 

contextlib

  • 새로운 contextlib.redirect_stderr() 컨텍스트 매니저(contextlib.redirect_stdout()과 흡사)가 추가되었습니다. (issue 22389에서 Berker Peksag님이 기여해주셨습니다.)

 

curses

  • curses.update_line_cols() 함수가 추가되었습니다. 이 함수는 curses.LINES, curses.COLS 값을 갱신합니다. 수동으로 창 크기가 변경되었을 때 유용합니다.

 

difflib

  • difflib.HtmlDiff.make_file()로 생성된 HTML 문서의 인코딩은 charset 키워드를 이용해 변경할 수 있습니다. HTML 문서의 기본 인코딩은 ISO-8859-1에서 utf-8로 변경되었습니다. (issue 2052에서 Berker Peksag님이 기여해주셨습니다.)
  • byte strings의 리스트를 difflib.diff_bytes()를 통해 비교할 수 있게 되었습니다. (Python 2보다 못했던 것을 수정함.)

 

distutils

  • buildbuild_ext 명령어는 확장 모듈의 병렬 빌드를 위해 -j 옵션(-j 8 = 8코어 사용)을 지원합니다. (issue 5309에서 Antoine Pitrou님이 기여해주셨습니다.)
  • LZMA 압축을 지원합니다. (issue 16314에서 Serhiy Storchaka님이 기여해주셨습니다.)

 

doctest

  • 모듈이 docstrings을 포함하고 있지 않는다면 ValueError 예외를 반환하는 대신에 doctest.DocTestSuite()는 비어있는 unittest.TestSuite를 반환합니다. (issue 15916에서 Glenn Jones님이 기여해주셨습니다.)

 

email

  • (TBW)
  • 새로 추가된 get_content_disposition() 메소드를 이용해 Content-Disposition 헤더의 정규값을 쉽게 접근할 수 있습니다. (그러한 헤더가 없다면 None을 반환합니다.) (issue 21083에서 Abhilash Raj님이 기여해주셨습니다.)
  • 새로운 정책 옵션, utf8True로 설정하면 이메일 헤더를 utf8 캐릭터셋으로 인코딩하게 됩니다. 이는 RFC 6532에 따른 것이며 RFC 6531 SMTPUTF8을 지원하는 서버와 함께 사용될 수 있습니다. (issue 24211에서 R. David Murray님이 기여해주셨습니다.)

 

glob

  • isglob()glob() 함수는 "**" 패턴을 통해 하위 디렉토리까지 검색할 수 있습니다. (issue 13968에서 Serhiy Storchaka님이 기여해주셨습니다.)

 

idlelib and IDLE

(TBW)

 

imaplib

  • (TBW)
  • (TBW)
  • (TBW)

 

imghdr

  • what() 함수는 OpenEXR 포맷을 인식할 수 있게 되었습니다. (issue 20295에서 Martin Vignali와 Claudiu Popa님이 기여해주셨습니다.)

 

importlib

  • importlib.util.LazyLoader는 시작 시간이 중요한 애플리케이션의 모듈에 대한 lazy load를 지원합니다. (issue 17621에서 Brett Cannon님이 기여해주셨습니다.)
  • importlib.abc.InspectLoader.source_to_code()는 이제 static 메소드입니다. exec(code, module.__dict__)를 이용하면 모듈 안에서 코드를 실행할 수 있습니다.
  • importlib.util.module_from_spec()는 이제 새로운 모듈을 생성하는 더 적당한 방법입니다. types.ModuleType과 비교 해볼 때 이 함수는 넘겨진 스펙 객체에 기반하여 여러 속성을 설정합니다.

 

inspect

  • inspect.Signatureinspect.Parameter는 이제 picklable, hashable 합니다. (객체 직렬화) (issue 20276issue 20334에서 Yury Selivanov님이 기여해주셨습니다.)
  • 새로운 메소드: inspect.BoundArguments.apply_defaults(). (issue 24190에서 Yury Selivanov님이 기여해주셨습니다.)
  • 새로운 클래스 메소드: inspect.Signature.from_callable() - Signature의 서브클래스를 더 쉽게 만들 수 있게 해줍니다. (issue 17373에서 Yury Selivanov, Eric Snow님이 기여해주셨습니다.)
  • inspect.signature()를 위한 새로운 인자: follow_wrapped. (issue 20691에서 Yury Selivanov님이 기여해주셨습니다.)
  • iscoroutine(), iscoroutinefunction(), isawaitable() 함수가 추가되었습니다. (issue 24017에서 Yury Selivanov님이 기여해주셨습니다.)

 

ipaddress

  • ipaddress.IPv4Networkipaddress.IPv6Network(address, netmask) 튜플 인자를 허용합니다. 따라서 이미 존재하는 네트워크 주소로부터 네트워크 객체를 쉽게 생성할 수 있습니다. (issue 16531에서 Peter Moody, Antoine Pitrou님이 기여해주셨습니다.)

 

json

  • json.tool CLI의 아웃풋은 input의 순서와 동일합니다. --sort-key 옵션을 이용해 JSON 키의 알파벳 순서대로 정렬할 수 있습니다. (issue 21650에서 Berker Peksag님이 기여해주셨습니다.)
  • JSON 디코더는 ValueError 대신에 json.JSONDecodeError 예외를 반환합니다. (issue 19361에서 Serhiy Storchaka님이 기여해주셨습니다.)

 

math

  • math.infmath.nan 상수가 추가되었습니다. (issue 23185에서 Mark Dickinson님이 기여해주셨습니다.)
  • math.isclose() 함수가 추가되었습니다. (issue 24270에서 Chris Barker, Tal Einat님이 기여해주셨습니다.)

 

os

  • os.scandir() 함수는 디렉토리를 리스팅할 때 OS로부터 파일 정보를 읽어옵니다, 또한 주어진 경로의 엔트리에 맞는 os.DirEntry 오브젝트의 이터레이터를 리턴합니다. (issue 22524에서 Ben Hoyt(with the help of Victor Stinner)님이 기여해주셨습니다.)

 

os.path

  • commonpath() 함수는 common path prefix를 추출합니다. commonprefix() 함수와는 다르게, 항상 유효한 경로를 반환합니다. (issue 10395에서 Rafik Draoui, Serhiy Storchaka님이 기여해주셨습니다.)

 

pickle

  • 할당되지 않은 메소드나 nested class와 같은 더 "찾을 수 있는" 객체까지 직렬화합니다. pickle protocols < 4에서 지원됩니다. (issue 23611에서 Serhiy Storchaka님이 기여해주셨습니다.)

 

poplib

  • POP 서버가 지원한다면 utf8() 함수는 RFC 6856 (internationzlied email)를 활성화합니다. (issue 21804에서 Milan OberKirch님이 기여해주셨습니다.)

 

re

  • 정규식 내에 있는 최대 그룹 캡쳐 제한(100개)이 풀렸습니다. (issue 22437에서 Serhiy Storchaka님이 기여해주셨습니다.)
  • re.sub(), re.subn() 에서 매치되지 않은 그룹은 빈 문자열로 치환됩니다. (issue 1519638에서 Serhiy Storchaka님이 기여해주셨습니다.)

 

shutil

  • move() 함수는 copy_function 인자를 허용합니다. 예를 들어, 메타데이터를 무시해야 하는 경우 copy2() 함수 대신에 copy() 함수가 사용됩니다. (issue 19840에서 Claudiu Popa님이 기여해주셨습니다.)

 

signal

  • 윈도우에서, signal.set_wakeup_fd() 함수는 소켓 핸들링을 지원합니다. (issue 22018에서 Victor Stinner님이 기여해주셨습니다.)
  • signal 모듈의 다른 상수들은 enum 모듈을 이용해 열거형으로 바뀌었습니다. 이것은 디버깅 시에 숫자를 출력하는 대신에 의미있는 이름(상수의 이름)을 보여줄 수 있다는 뜻입니다. (issue 21076에서 Giampaolo Rodola' 님이 기여해주셨습니다.)

 

smtpd

  • SMTPServersmtpd.SMTPChannel은 SMTP 데이터가 utf-8 코덱으로 디코딩 되었는지 아니면 대신 process_message() 를 byte string 으로 제공했는지 알아내기 위해 decode_data를 허용합니다. 호환성 문제로 기본값은 True입니다. 하지만 Python 3.6에서는 False로 변경될 예정입니다. (issue 19662에서 Maciej Szulik님이 기여해주셨습니다.)
  • (TBW)
  • (TBW)
  • (TBW)

 

smtplib

  • 새로 추가된 auth() 메소드는 커스텀 인증 메카니즘을 구현하기 위한 더 편한 방법을 제공합니다. (issue 15014에서 Milan Oberkirch님이 기여해주셨습니다.)
  • 디버그 레벨(2)은 smtplib.SMTP 내부의 타임 스탬프를 보여줍니다. (issue 16914에서 Gavin Chappell, Maciej Szulik님이 기여해주셨습니다.)
  • smtplibRFC 6531 (SMTPUTF8)을 sendmail(), send_message() 커맨드에서 모두 지원합니다. (issue 22027에서 Milan Oberkirch, R. David Murray님이 기여해주셨습니다.)

 

sndhdr

  • what() 함수와 whathdr() 함수는 namedtuple()을 반환합니다. (issue 18615에서 Claudiu Popa님이 기여해주셨습니다.)

 

socket

  • 새로 추가된 socket.socket.sendfile() 메소드는 UNIX에서 업로드 속도가 socket.socket.send()를 사용했을 때보다 2배에서 3배 더 빠른 결과를 보여주는 고성능의 os.sendfile() 함수를 이용해 파일을 전송합니다. (issue 17552에서 Giampaolo Rodola'님이 기여해주셨습니다.)

 

subprocess

  • 새로 추가된 subprocess.run() 함수는 subprocess를 실행하고 subprocess.CompletedProcess 객체를 반환합니다. 이것은 call(), check_call(), check_output() 함수들보다 더 일관적인 API입니다.

 

sys

  • set_coroutine_wrapper(), get_coroutine_wrapper() 함수가 추가되었습니다. (issue 24017에서 Yury Selivanov님이 기여해주셨습니다.)

 

sysconfig

  • (TBW)

 

tarfile

  • tarfile.open() 함수는 'x'(exclusive creation) 모드를 지원합니다. (issue 21717에서 Berker Peksag님이 기여해주셨습니다.)
  • extractall(), extract() 메소드는 키워드 인자로 숫자로만 받습니다. 만약 True로 설정되었다면 추출되는 파일과 폴더는 숫자 형태의 uid와 gid의 소유로 설정됩니다. False(기본값)로 설정되었다면 이름 형태의 user와 group의 소유로 설정됩니다. (issue 23193에서 Michael Vogt, Eric Smith님이 기여해주셨습니다.)

 

time

  • time.monotonic() 함수는 이제 항상 유효합니다. (issue 22043에서 Victor Stinner님이 기여해주셨습니다.)

 

tkinter

  • (TBW)

 

types

  • coroutine() 함수를 지원합니다. (issue 24017에서 Yury Selivanov님이 기여해주셨습니다.)

 

urllib

  • 새로 추가된 HTTPPasswordMgrWithPriorAuth는 HTTP Basic Auth 정보가 관리되는 것을 허용합니다. 따라서 만약 Authorization 헤더가 전송되지 않은 경우 401 대신 404 응답을 주는 서버와 통신하기 위해 불필요한 401 결과 핸들링을 하지 않거나 강제로 첫 요청에 인증 정보를 전송하게 됩니다. (issue 19494에서 Matej Cepl님이, issue 7159에서 Akshit Khurana님이 기여해주셨습니다.)
  • urlencode() 에 새로 추가된 quote_via 파라미터는 필요한 경우 쿼리의 코딩을 건드릴 수 있는 방법을 제공합니다. (issue 13866에서 Samwyse, Arnon Yaari님이 기여해주셨습니다.)

 

wsgiref

  • wsgiref.headers.Header의 헤더 파라미터는 optional입니다. (issue 5800에서 Pablo Torres Navarrete, SilentGhost님이 기여해주셨습니다.)

 

xmlrpc

  • xmlrpc.client.ServerProxycontext manager입니다. (issue 20627에서 Claudiu Popa님이 기여해주셨습니다.)

 

xml.sax

  •  SAX 파서는 InputSource 객체의 character stream을 지원합니다. (issue 2175에서 Serhiy Storchaka님이 기여해주셨습니다.)

 

faulthandler

  • enable(), register(), dump_traceback(), dump_traceback_later() 함수들은 fd(file descriptors)를 허용합니다. (issue 23566에서 Wei Wu님이 기여해주셨습니다.)

 

zipfile

  • ZIP 파일을 unseekable streams에 쓸 수 있도록 지원합니다.  (issue 23252에서 Serhiy Storchaka님이 기여해주셨습니다.)
  • zipfile.ZipFile.open() 함수는 'x' (exclusive creation) 모드를 지원합니다. (issue 21717에서 Serhiy Storchaka님이 기여해주셨습니다.)

 

최적화

다음과 같은 성능 향상이 있습니다:

  • os.walk() 함수는 POSIX 시스템에서 3배에서 5배, Windows 시스템에서 7배에서 20배 빨라졌습니다. 이것은 os.scandir() 함수를 사용함으로써 이루어졌습니다.
  • bytes(int) (0바이트로 채운 bytes) 의 속도가 더 빨라졌고 더 큰 객체에 대해서도 더 적은 메모리를 사용합니다. 메모리를 할당하기 위해 calloc()malloc() 대신에 사용됩니다.
  • IPv4Network, IPv6Network에 있는 subnets(), supernet(), summarize_address_range(), collapse_addresses() 와 같은 일부 명령들이 빨라졌습니다. 약 3배에서 15배 가량 향상되었습니다.
  • io.BytesIO()에 있는 많은 명령들이 50%에서 100% 가량 빨라졌습니다.
  • marshal.dumps() 함수가 빨라졌습니다. (버전 3-4에서 65%-85%, 버전 0-2의 typical data에서 20-25%, 그리고 좋은 상황에서는 5배까지.)
  • UTF-32 인코더의 속도가 3배에서 7배 정도 빨라졌습니다.

 

빌드, C API의 변경사항

  • 새로운 calloc() 함수:
     PyMem_RawCalloc(), PyMem_Calloc(), PyObject_Calloc(), _PyObject_GC_Calloc()

 

삭제될 것들 (deprecated)

새로운 키워드

async, await 를 변수명, 클래스명, 함수명으로 사용하는 것은 권장되지 않습니다. Python 3.5의 PEP 492에서 소개했듯이 Python 3.7부터는 주로 사용되는 키워드가 될 것 입니다.

 

지원하지 않는 OS

  • Windows XP - PEP 11, MS의 Windows XP 지원이 끝났습니다.

 

삭제될 파이썬 모듈, 함수, 메소드

  • formatter 모듈은 완전히 끝났고 Python 3.6에서 삭제될 예정입니다.
  • smtpd는 이전까지 항상 utf-8 코덱을 이용해 데이터를 디코딩했었습니다. 이건 이제 decode_data 키워드를 통해 제어될 수 있습니다. 기본값은 True 입니다. 하지만 기본값은 더이상 제공되지 않을 예정입니다. deprecation warning을 보기 싫다면 decode_data 키워드를 직접 설정하세요.
  • Morsel 객체의 key, value, codec_value 에 직접 값을 할당하는 것은 막힐 예정입니다. 대신에 set() 메소드를 이용하세요. 추가로, 문서화되지 않은 set()LegalChars 파라미터 또한 제거될 것이고 현재는 무시되고 있습니다.
  • format_string 키워드 인자로 string.Formatter 클래스의 format() 메소드로 넘기는 것은 삭제될 예정입니다.
  • platform.dist(), platform.linux_distribution() 함수들은 Python 3.7에서 완전히 제거될 예정입니다. 리눅스 배포판은 그것들을 설명하기 위한 너무 많은 방법이 있습니다.
  • 사전에 문서화되지 않은 inspect.Signaturefrom_function, from_builtin 메소드는 삭제될 예정입니다. 대신에 inspect.Signature.from_callable() 메소드를 이용하세요.
  • inspect.getargspec() 메소드는 삭제될 예정이고 Python 3.6에서 제거되기로 스케쥴되어 있습니다.
  • getfullargspec(), getargvalues(), getcallargs(), gertargvalues(), formatargspec(), formatargvalues() 함수들은 inspect.signature() API를 위해 제거될 예정입니다.

 

삭제된 것들

API와 기능의 삭제

한물간, 사전에 삭제되기로 공지된 API와 기능들은 다음과 같습니다:

  • __version__ 속성은 email 패키지에서 삭제되었습니다. email 코드는 stdlib 와 분리되지 않은지 꽤 오래 지났고, __version__ 문자열은 지난 몇 업데이트 동안 전혀 갱신되지 않았었습니다.
  • ftplib 모듈 내부의 Netrc 클래스는 3.4에서 deprecated 됐었고, 현재는 제거되었습니다.
  • .pyo 파일의 개념이 삭제되었습니다.
  • asyncio 모듈에 있던 JoinableQueue 클래스는 3.4.4에서 삭제 공고 됐었고, 현재는 제거되었습니다.

 

Python 3.5로 갈아타기

이 내용은 작성했던 코드들의 변경이 필요할 수도 있는 변경점과 버그 픽스에 대한 내용입니다.

C API는 소개하지 않고 Python API에 대해서만 소개합니다.

  • PEP 475: 시그널 핸들러가 예외를 반환하지 않아 InterruptedError가 반환되는 대신에 인터럽트 됐을 때 재시도 되는 함수들: 여기에서 참고
  • Python 3.5 이전에, UTC로 자정을 나타낼 때 datetime.time 객체는 false로 여겨졌습니다. 이것은 잘 알려져있지 않고 오류가 발생하기 쉬워 Python 3.5에서는 제거되었습니다. 더 자세한 정보는 issue 13936를 확인하세요.
  • ssl.SSLSocket.send() 는 operation이 block될 것 같으면 ssl.SSLWantReadError 또는 ssl.SSLWantWriteError 예외를 반환합니다. 이전에는 0을 반환했었습니다. issue 20951을 확인하세요.
  • 제너레이터의 __name__ 속성은 코드의 이름으로 설정되는 대신에 함수 이름으로 설정됩니다. gen.gi_code.co_name 을 이용해서 코드 이름을 가져올 수 있습니다.제너레이터는 또한 __qualname__ 이라는 새로운 속성을 가지는데 이는 제너레이터를 대표하는 용도로 사용됩니다 (repr(gen)). issue 21205를 확인하세요.
  • 삭제가 예고된 HTMLParser의 "strict" mode와 인자, HTMLParser.error(), HTMLParserError 예외는 삭제되었습니다. HTMLParserconvert_charrefs 인자는 기본값으로 True 입니다.
  • 정식 API가 아니기는 하지만, "'sometype' does not support the buffer protocol'"와 같이 쓰였던 오류 메시지가 이제는 "a bytes-like object is required, not 'sometype'"과 같이 쓰였다는 점은 주목받을 만한 점입니다. (애매모호한 번역)
  • 만약 현재 디렉토리가 존재하지 않는 디렉토리로 설정된 경우에 FileNotFoundError 예외는 더 이상 발생하지 않고 대신에 find_spec() 함수는 전형적인 경우와는 다르게 sys.path_importer_cache 안에서 None 을 캐싱하지 않으면서 None 을 반환합니다.
  • http.client, http.server 의 HTTP 상태 코드와 메시지는 HTTPStatus enum으로 리팩토링 됩니다. 기존 값들은 하위 호환성을 위해 남아있습니다.
  • import loaderexec_module()을 정의할 때 create_module()도 같이 정의될 것입니다. (지금은 DeprecationWarning이 발생하지만 Python 3.6에서는 오류가 발생할 것입니다.) 만약 loaderimportlib.abc.Loader를 상속받는 경우에는 아무 것도 하지 않습니다, 그렇지 않다면 create_module()을 정의하고 None을 반환합니다.
  • re.split() 은 항상 빈 패턴 매치는 무시합니다, 따라서 "x*" 패턴은 "x+"와 동일하게 작동하고 "\b" 패턴은 동작하지 않습니다. 이제는 re.split() 을 실행했을 때 빈 패턴을 매치했다면 경고를 반환합니다. 호환성을 위해 빈 패턴을 매치하지 않는 패턴을 사용해주세요 (예: "x*" 대신에 "x+"). 빈 문자열("\b"와 같은)을 매치한 패턴은 이제 오류를 반환합니다.
  • PEP 488 에 의해 .pyo 파일들이 파이썬에서 제거되고 .pyc 파일명에 opt- 태그가 제공됩니다. 위 내용을 참고해주세요.
  • pygettext.py 툴은 표준 +NNNN 포맷을 타임존에 사용합니다.
  • socket 모듈은 CAN_RAW_FD_FRAMES를 포함합니다. 리눅스 3.6 이상 버전에서 사용할 수 있습니다. CAN_RAW 소케에서 CAN FD를 활성화 시킵니다. 기본적으로는 비활성화 되어있습니다. 이를 이용하면 애플리케이션에서 CAN, CAN FD 프레임 모두를 전송할 수 있게 됩니다.
  • smtplib 모듈은 디버그 아웃풋으로 sys.stderr을 사용합니다. 예를들어 테스트 코드라던가.. 어딘가에 디버그 아웃풋을 캡쳐하는 부분을 만들었다면 sys.stderr을 캡쳐하도록 수정하세요.
  • 빈 문자열을 찾았고 문자열 범위를 초과했다면 str.startswith(), str.endswith() 메소드는 더 이상 True를 리턴하지 않습니다.

정리하고 보니까 엄청 많네요.. 중간중간에 크고 작은 오역이 있는 것 같기도 합니다. 댓글로 남겨주시면 수정하도록 하겠습니다.

막상 원문 업데이트 되면 같이 업데이트 하겠다고는 했는데 이제 하기가 겁나는군요. (...)

 

Python 3.x에 대한 개인적인 견해는. 지금이라도 시작하는 게 늦지 않는 일이라 봅니다. Python 2.7은 지난 몇 년간 큰 업데이트가 거의 없다시피 했고, 지금까지 Python 2.7이 3.x에 비해 좋은 장점이 속도 하나 밖에 없었는데 이 속도 면에서도 거의 따라잡혔으니 더 이상 쓸 이유가 없지 않나 싶습니다. 이제 그만 놔주시고 새로운, Python 3.x 세상으로 넘어오세요!