
파이썬 3.x에서 많은 것이 바뀌었기 때문에, 파이썬 3.x는 2.x와 호환되지 않습니다. 따라서 기존의 파이썬 2.x용 코드는 파이썬 3.x용으로 재작성해야 합니다.
What’s New in Python 3.0에 있는 주요 변경 사항을 번역해 보면 이렇습니다.
* '일반 문자열(str)'은 '바이트(bytes)'가 되고, '유니코드 문자열(unicode)'은 '일반 문자열(str)'이 되었습니다. 즉, 3.x에서 '어쩌고' 라고 쓰면 2.x에서의 u'어쩌고' 와 같은 의미입니다.
>>> 'hello'
'hello' # 3.x의 일반 문자열, 즉 2.x의 유니코드 문자열입니다.
>>> 'hello'.encode('utf-8')
b'hello' # UTF-8로 인코드하니까 바이트가 되네요.
>>> b'hello'.decode('utf-8')
'hello' # 바이트를 디코드하면 일반 문자열이 됩니다.
* 유니코드 문자열이 기본이므로, 파일 입출력 시 인코딩을 지정해야 합니다. 인코딩 기본값은 UTF-8입니다.
>>> open('ascii.txt').read()
'ascii\n'
>>> open('ascii.txt', 'rb').read()
b'ascii\n'
>>> open('utf-8.txt').read()
'\uc720\ud2f0\uc5d0\ud504\ud314\n'
>>> open('euc-kr.txt').read()
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 0-1: invalid data
>>> open('euc-kr.txt', encoding='euc-kr').read()
'\ud558\ud558\ud558 \uc774\ub140\uc11d \ud558\ud558\ud558\n'
* map(), filter(), zip()이 이터레이터를 반환합니다.
* apply(), callable(), coerce(), execfile(), file(), reduce(), reload()가 사라집니다. 헉... reload() 말고 뭘 쓰라는 거지...
* dict의 .keys(), .items(), .values()도 이터레이터를 반환합니다.
* 1/2는 0.5고, 1//2는 0입니다.
* print가 함수로 바뀌었기 때문에, print('어쩌고')로 써야 합니다. 따라서 2.x에서 print만 써서 줄바꿈하던 것도 안 됩니다.
약간 덜 중요한 변경 사항입니다.
* 소스 파일의 기본 인코딩이 UTF-8로 바뀌었습니다.
* 변수명/함수명에 한글을 쓸 수 있습니다! 한글 변수명을 써서 코딩할 수 있겠군요. 한번 해 보고 싶어요.
* 모든 예외 객체가 상속하는 BaseException이 생겼습니다.
* repr()과 같은 의미의 `어쩌고`가 사라졌습니다. obfuscator 토끼군에게는 안 좋은 소식이 되겠네요.
* !=과 같은 의미의 <>가 사라졌습니다. 그런데 파이썬에도 <>가 있었나요...
* dict.has_key()가 사라졌습니다. key in dict 표현을 쓰라는 뜻인가 봅니다.
그 외에도 많은 것이 바뀌었습니다.
정말 많은 게 바뀌어서, 당분간 혼동이 올 듯합니다. 기존의 코드를 파이썬 3.x로 옮기는 등의 대비를 미리 해놔야겠네요.
Posted by 랜덤여신

