PEP 3100 – 기타 Python 3.0 계획
- Author:
- Brett Cannon <brett at python.org>
- Status:
- Final
- Type:
- Process
- Created:
- 20-Aug-2004
- Post-History:
번역·라이선스 안내
이 비공식 한국어 번역은 원문 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
스타일 변경
- 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 등 오래된 시스템에 대한 지원을 제거합니다
참고 문헌
Copyright
This document has been placed in the public domain.