Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python 개선 제안 한국어 번역

PEP 3100 – 기타 Python 3.0 계획

Author:
Brett Cannon <brett at python.org>
Status:
Final
Type:
Process
Created:
20-Aug-2004
Post-History:


Table of Contents

번역·라이선스 안내

이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판

초록

이전에 PEP 3000으로 알려졌던 이 PEP는 아직 별도의 PEP가 작성되지 않은 소규모 변경 사항과 새 기능을 설명하며, 이들은 모두 Python 3000을 목표로 합니다.

이 문서에 포함된 기능 목록은 변경될 수 있으며 Python 개발 커뮤니티를 구속하지 않습니다. 기능은 언제든지 추가, 제거, 수정될 수 있습니다. 이 목록의 목적은 언어 개발 노력을 3.0으로 나아가는 단계가 되는 변경 사항에 집중하고, 사람들이 전환을 원활하게 할 방법을 고안하도록 장려하는 것입니다.

이 문서는 누구나 항목을 추가할 수 있는 희망 목록이 아닙니다. 이 PEP의 저자는 두 명이지만 저희는 글을 제공할 뿐이며, 이 문서에 어떤 변경 사항을 올릴지는 Guido van Rossum이 결정합니다. 그는 이 변경 사항들을 Python 3.0의 목표로 선정했습니다.

Python 3.0에서 변경되지 않을 사항에 대한 Guido의 결정은 PEP 3099에 기록되어 있습니다.

일반 목표

일반적인 목표는 옛 방식을 제거하여 기능 중복을 줄이는 것입니다. 설계의 일반 원칙은 어떤 일을 하는 명확한 방법이 하나면 충분하다는 것입니다. [1]

영향을 준 PEP

  • PEP 238 (나눗셈 연산자 변경)
  • PEP 328 (임포트: 여러 줄 및 절대/상대 임포트)
  • PEP 343 (“with” 문)
  • PEP 352 (예외에 필수인 슈퍼클래스)

스타일 변경

  • C 스타일 가이드는 탭을 절대 쓰지 않고 4칸 들여쓰기를 사용하도록 갱신됩니다. 이 스타일은 모든 새 파일에 사용해야 합니다. 기존 파일은 해당 파일을 Python 2 HEAD에서 병합할 가능성이 전혀 없는 경우에만 갱신할 수 있습니다. 한 파일 안에서는 들여쓰기 스타일이 일관되어야 합니다. 현재로서는 그 밖의 스타일 가이드 변경은 계획되어 있지 않습니다.

핵심 언어

  • 참 나눗셈이 기본 동작이 됩니다 PEP 238 [완료]
  • exec를 문으로 둘 가치가 없으므로 함수로 만듭니다 [완료]
  • 정적 타이핑을 위한 선택적 선언을 추가합니다 PEP 3107 [10] [완료]
  • 새 스타일 클래스만 지원하며, 클래식 클래스는 사라집니다 [1] [완료]
  • print를 함수로 대체합니다 [14] PEP 3105 [완료]
  • 파일의 softspace 속성이 사라집니다. [완료]
  • 오류 변수가 필요하면 except E1, E2, E3 as err:를 사용하십시오. [3] [완료]
  • None이 키워드가 되며 [4], True와 False도 마찬가지입니다 [완료]
  • ...이 일반 표현식 요소가 됩니다 [16] [완료]
  • as가 키워드가 됩니다 [5] (이미 2.6부터 시작) [완료]
  • 리스트 컴프리헨션을 동등한 제너레이터 표현식을 list()에 전달하는 것의 문법적 설탕으로 만듭니다. 그 결과 루프 변수는 더 이상 노출되지 않습니다 PEP 289 [done]
  • 서로 다른 타입 간의 ==와 != 이외의 비교는 해당 타입이 명시적으로 지원하지 않는 한 예외를 발생시킵니다 [6] [done]
  • float가 의도치 않게 허용되는 연산(PyArg_ParseTuple()의 i 및 l 형식)에서는 int 대신 float를 인자로 받지 않습니다.
  • 함수 스코프에서 from … import * 구문을 제거합니다. [done] 이는 함수를 항상 최적화할 수 있으며, 최적화되지 않은 함수에 대한 지원을 없앨 수 있음을 의미합니다.
  • 임포트 PEP 328
    • 임포트는 기본적으로 절대 임포트가 됩니다. [done]
    • 상대 임포트는 명시적으로 지정해야 합니다. [done]
    • sys.modules의 간접 참조 항목(즉, A.string에 대한 값이 None이면 최상위 string 모듈을 사용하라는 의미)은 지원되지 않습니다.
  • 하위 패키지에서는 __init__.py가 선택 사항이 될 수도 있습니까? 최상위 패키지에는 여전히 __init__.py가 필요합니다.
  • Py_InitModule() 변형 {,3,4}을 정리합니다(import 및 parser API도 마찬가지입니다).
  • pythonrun 등에서 내보내는 API를 정리합니다.
  • 일부 표현식은 2.x에서는 필요하지 않았던 괄호가 필요하게 됩니다:
    • 리스트 컴프리헨션에서는 이터러블을 괄호로 감싸야 합니다. 이렇게 하면 리스트 컴프리헨션이 제너레이터 컴프리헨션과 더 비슷해집니다. [x for x in 1, 2]는 다음과 같이 작성해야 합니다: [x for x in (1, 2)] [done]
    • 람다는 괄호로 감싸야 할 수도 있습니다 PEP 308 [NO]
  • __builtin__과 __builtins__ 사이의 혼동을 없애기 위해, __builtin__(내장 모듈)의 이름을 builtins로 바꾸고 __builtins__(샌드박스 훅)는 그대로 두기로 결정했습니다. [33] [34] [done]
  • func_whatever 형태의 함수 속성은 __whatever__로 이름이 바뀝니다 [17] [done]
  • 집합 리터럴과 컴프리헨션 [19] [20] [done] {x}는 set([x])를 의미하고, {x, y}는 set([x, y])를 의미합니다. {F(x) for x in S if P(x)}는 set(F(x) for x in S if P(x))를 의미합니다. 주의. {range(x)}는 set(range(x))가 아니라 set([range(x)])를 의미합니다. 빈 집합에 대한 리터럴은 없습니다. set()을 사용하십시오(또는 {1}&{2} :-). frozenset 리터럴은 없습니다. 필요한 경우가 너무 드물기 때문입니다.
  • __nonzero__ 특수 메서드는 __bool__로 이름이 바뀌며 bool을 반환해야 합니다. typeobject 슬롯의 이름은 tp_bool이 됩니다 [23] [done]
  • PEP 274에서 처음 제안된 딕셔너리 컴프리헨션 [done] {K(x): V(x) for x in S if P(x)}는 dict((K(x), V(x)) for x in S if P(x))를 의미합니다.

제거 대상:

  • 문자열 예외: Exception 클래스의 인스턴스를 사용하십시오 [2] [done]
  • raise Exception, "message": raise Exception("message")를 사용하십시오 [12] [done]
  • x: repr(x)를 사용하십시오 [2] [done]
  • <> 연산자: 대신 !=를 사용하십시오 [3] [done]
  • float의 __mod__ 및 __divmod__ 특수 메서드. [유지해야 합니다] [21]
  • 언바운드 메서드를 제거합니다 [7] [26] [done]
  • METH_OLDARGS [done]
  • WITH_CYCLE_GC [done]
  • __getslice__, __setslice__, __delslice__ [32]; 슬라이스 옵코드를 제거하고 슬라이스 객체를 사용합니다. [done]
  • __oct__, __hex__: 대신 oct()와 hex()에서 __index__를 사용합니다. [done]
  • __methods__와 __members__ [done]
  • C API(코드 참조): PyFloat_AsString, PyFloat_AsReprString, PyFloat_AsStringEx, PySequence_In, PyEval_EvalFrame, PyEval_CallObject, _PyObject_Del, _PyObject_GC_Del, _PyObject_GC_Track, _PyObject_GC_UnTrack PyString_AsEncodedString, PyString_AsDecodedString PyArg_NoArgs, PyArg_GetInt, intargfunc, intintargfunc

    PyImport_ReloadModule ?

원자 타입

  • int 타입과 long 타입의 구분을 없앱니다. ‘long’ 내장 타입과 ‘L’ 또는 ‘l’ 접미사가 붙은 리터럴은 사라집니다 [1] [done]
  • 모든 문자열을 유니코드로 만들고, 별도의 bytes() 타입을 둡니다 [1] 새 문자열 타입의 이름은 ‘str’입니다. PEP 3137을 참조하십시오. [done]
  • 원자 타입 메서드에서 적절한 경우 리스트 대신 이터러블 뷰를 반환합니다(예: dict.keys(), dict.values(), dict.items() 등). iter* 메서드는 제거됩니다. [done]
  • string.join()이 인자를 문자열로 변환하도록 합니까? [18] [NO]
  • 모드가 잘못되었을 때 open()이 IOError가 아니라 ValueError를 반환하도록 수정합니다. [done]

제거 대상:

  • basestring.find()와 basestring.rfind(); try/except 블록 안에서 basestring.index()나 basestring.[r]partition() 또는 basestring.rindex()를 사용하십시오??? [13] [UNLIKELY]
  • file.xreadlines() 메서드 [31] [done]
  • dict.setdefault()? [15] [UNLIKELY]
  • dict.has_key() 메서드; in 연산자를 사용하십시오 [done]
  • list.sort()와 builtin.sorted() 메서드: cmp 매개변수를 제거합니다 [27] [done]

내장 네임스페이스

  • 적절한 경우 내장 함수가 이터레이터를 반환하도록 합니다(예: range(), zip(), map(), filter() 등) [done]
  • input()을 제거하고 raw_input()의 이름을 input()으로 바꿉니다. 예전 input()이 필요하면 eval(input())을 사용하십시오. [done]
  • 인자의 __trunc__() 메서드를 호출하는 trunc()를 도입합니까? 제안된 용도는 float처럼 __int__()를 호출하면 데이터 손실이 생기지만 여전히 정수 표현이 필요한 객체입니까? [8] [done]
  • 예외 계층 구조 변경 PEP 352 [done]
  • 정수의 이진 표현을 위한 bin() 함수를 추가합니다 [done]

제거 대상:

  • apply(): 대신 f(*args, **kw)를 사용하십시오 [2] [done]
  • buffer(): 없어져야 합니다(대신 bytes() 타입을 사용하십시오) (?) [2] [done]
  • callable(): 그냥 isinstance(x, collections.Callable)을 사용하십시오 (?) [2] [done]
  • compile(): sys에 둡니다(또는 별도의 모듈에 둘 수도 있습니다) [2]
  • coerce(): 더 이상 필요하지 않습니다 [2] [done]
  • execfile(), reload(): exec()를 사용하십시오 [2] [done]
  • intern(): sys로 옮깁니다 [2], [22] [done]
  • reduce(): functools로 옮깁니다. 대부분의 경우 루프가 더 읽기 쉽습니다 [2], [9] [done]
  • xrange(): 대신 range()를 사용하십시오 [1] [위의 range() 참조] [done]
  • StandardError: 원래 예외 계층 구조의 잔재입니다.
    대신 Exception의 서브클래스를 만드십시오. [done]

표준 라이브러리

  • 표준 라이브러리가 지금처럼 얕은 구조가 되지 않도록 재구성할 것입니까?
  • 테스트 코드를 제자리로 옮깁니다. 표준 라이브러리에는 더 이상 test() 함수가 없게 됩니다
  • 모든 테스트가 doctest나 unittest 중 하나를 사용하도록 변환합니다.
  • 표준 라이브러리 개선 절차는 PEP 3001을 참조하십시오

제거 대상:

  • sets 모듈. [done]
  • 제거할 표준 라이브러리 모듈
    • 소스의 독스트링과 주석을 참조하십시오
      • macfs [to do]
      • new, reconvert, stringold, xmllib, pcre, pypcre, strop [all done]
    • PEP 4를 참조하십시오
      • buildtools, mimetools, multifile, rfc822, [to do]
      • mpz, posixfile, regsub, rgbimage, sha, statcache, sv, TERMIOS, timing [done]
      • cfmfile, gopherlib, md5, MimeWriter, mimify [done]
      • cl, sets, xreadlines, rotor, whrandom [done]
    • lib-old에 있는 모든 것 PEP 4 [done]
      • Para, addpack, cmp, cmpcache, codehack, dircmp, dump, find, fmt, grep, lockfile, newdir, ni, packmail, poly, rand, statcache, tb, tzparse, util, whatsound, whrandom, zmod
  • sys.exitfunc: 대신 atexit 모듈을 사용하십시오 [28], [35] [done]
  • sys.exc_type, sys.exc_values, sys.exc_traceback: 스레드 안전하지 않습니다. sys.exc_info() 또는 예외의 속성을 사용하십시오 [2] [11] [28] [done]
  • sys.exc_clear: Python 3의 except 문이 동일한 기능을 제공합니다 [24] PEP 3110 [28] [done]
  • array.read, array.write [30]
  • operator.isCallable : callable() 내장 함수가 제거될 예정입니다 [29] [36] [done]
  • operator.sequenceIncludes : operator.contains가 있으므로 불필요합니다 [29] [36] [done]
  • thread 모듈에 있는, 잠금 객체의 acquire() 및 release() 메서드에 대한 acquire_lock() 및 release_lock() 별칭. (아마 thread 모듈 자체도 공개 API에서 제거하고, 항상 threading.py를 사용하도록 할 것입니다.)
  • UserXyz 클래스. 대신 XyzMixins를 사용합니다.
  • Queue.py에서 신뢰할 수 없는 empty()와 full() 메서드를 제거합니까? [25]
  • random API에서 jumpahead()를 제거합니까? [25]
  • random의 기본 연산을 무작위 부동소수점 수 대신 무작위 바이트를 생성하는 것으로 바꿉니까? [25]
  • Cookie.SerialCookie와 Cookie.SmartCookie를 없앱니까? [25]
  • heapq.heapreplace() API를 수정하여 새 값을 힙의 맨 위 값과 비교하도록 합니까? [25]

미해결 문제

  • C99를 요구하여, 여러 이점 중에서도 특히 // 주석과 이름 지정 초기화자를 사용하고 새 스코프를 도입하지 않고도 변수를 선언할 수 있게 합니다. (또한 NaN과 무한대 같은 IEEE 부동소수점 문제도 더 잘 지원합니까?)
  • BeOS, RISCOS, (SGI) Irix, Tru64 등 오래된 시스템에 대한 지원을 제거합니다

참고 문헌