BLOG ARTICLE 파이썬 | 3 ARTICLE FOUND

  1. 2010.02.13 드디어 열혈강의를... 1
  2. 2008.12.24 Python 2to3 스크립트 간단한 사용법 1
  3. 2008.12.23 python 2.x과 3.0의 차이

사실 파이썬 책 기획을 할 때, 출판사 분들에게 장담한 것 중 하나가 "열혈강의 파이썬"을 이겨 보겠다는 것이었습니다. 그런데 사실 늦게 시장에 들어가서 1등을 이기기는 쉽지가 않죠. 저희 마저도 힘들지 않을까하고 생각했지만, 며칠전 드디어 역전을 했습니다. 아직은 yes24 상에서 근소한 차이로 이기고 있지만, 앞으로 몇번의 퀀텀점프 가능성이 있는 이벤트가 있으므로 보다 긍정적인 기대를 해도 좋지 않을까 생각합니다.

http://www.yes24.com/2.0/Category/CategoryMain.aspx?CategoryNumber=001001003016003005

새해 복 많이 받으세요~
AND

간단하게 2.x에서 3.0으로 변환이 잘 되는지 테스트해보기 위해 다음과 같이
test.py 파일을 작성해 보겠습니다.

def div(a):
  print u"Result :", a/2
num = raw_input("input any number :")
div(int(num))

그럼 test.py 파일을 2to3.py를 이용해서 변환을 해 보겠습니다.

C:\Python30\Tools\Scripts>2to3.py -w test.py
RefactoringTool: Skipping implicit fixer: buffer
RefactoringTool: Skipping implicit fixer: idioms
RefactoringTool: Skipping implicit fixer: set_literal
RefactoringTool: Skipping implicit fixer: ws_comma
--- \Python30\test_.py (original)
+++ \Python30\test_.py (refactored)
@@ -1,4 +1,4 @@
 def div(a):
-  print u"Result :", a/2
-num = raw_input("input any number :")
+  print("Result :", a/2)
+num = input("input any number :")
 div(int(num))
RefactoringTool: Files that were modified:
RefactoringTool: \Python30\test_.py

참고사항.
2to3에 -w 옵션을 주지 않으면 어떻게 변경해야하는지만 화면에 출력하고, 파일에 직접 수정을 가하진 않습니다.

이제 아래와 같이 바뀐 것을 확인할 수 있습니다.

C:\Python30\Tools\Scripts>type test.py
def div(a):
  print("Result :", a/2)
num = input("input any number :")
div(int(num))

다음과 같이 실행도 잘 되는 것을 확인할 수 있네요.

>test.py
input any number :3
Result : 1.5


간단한 프로그램은 이렇게 쉽게 변환이 되지만,
큰 모듈의 경우에는 테스트케이스를 견고하게 짜서 오동작을 하는지 안하는지 체크하는 것이 필수적으로 필요할 것입니다.

또한 2.5 이하의 버전의 코드를 3.0으로 포팅하려면,
우선 2.6으로 코드를 포팅하고, 2.6에서 -3 옵션을 붙여서 실행 한 후, 경고를 처리합니다.
공식문서에서는 위 작업을 완료한 후에 2to3을 사용하는 것을 권장하고 있습니다.


메리 크리스마스~~~
AND

후우, 한동안 포스팅이 뜸했는데요.

오늘은 python 2.x과 3.0의 차이를 살펴보겠습니다.

이전 글에서 썼듯이, 파이썬3000(파이썬3k)이라고도 불리는 파이썬 3.0이 2008년 12월 초에 발표되었습니다.
이번 변경 사항 중에 특히 주목해야할 것은 파이썬 2.x 버전들과 하위 호환성을 전혀 유지하고 있지 않은 것입니다.
실무에 사용하던 분들은 아직 3.0을 적용할 필요성을 못 느끼시는 분들이 많을 것이나,
추후 적용하기 위해서는 차이점을 짚고 넘어가야 할 것입니다.

자료형이나 내부 구성의 변화 등도 크게 변화 했지만, 아무래도 사용자 입장에서는 다음 사항들이 가장 크게 느껴질 것입니다.


* 체감상으로 가장 큰 차이점은 print가 함수형태로 변경된 점입니다.

Old style :
>>> print "welcome to", "python3k"
welcome to python3k

New style :
>>> print( "welcome to","python3k" )
welcome to python3k

또한 입력인자로 다음과 같이 sep, end, file 를 줄 수 있습니다.

>>> print("welcome to","python", sep="~", end="!", file=sys.stderr)
welcome to~python!

이와 유사하게 입출력관련해서 변경된 점들이 많습니다.
raw_input이 input으로 변경되고,
as, with 예약어가 추가되었습니다.
또한 새로운 string formatting을 제공한답니다.

* long type이 없어졌습니다. 즉, int로 통일 되었습니다.

Old :
>>> type(2**31)
<type 'long'>

New :
>>> type(2**31)
<class 'int'>
>>> type(2**40)
<class 'int'>

2.x에서는 sys.maxint 이하의 값은 int로 처리되고 그 이상의 값은 long으로 처리되었는데요,
3.0에서부터는 모두 int로 처리됩니다.

Old :
>>> sys.maxint
2147483647
>>> type( sys.maxint )
<type 'int'>
>>> type( sys.maxint+1 )
<type 'long'>

* int / int 의 결과는 float 으로 처리됩니다.

Old :
>>> 1/2
0
>>> 3/2
1

New :
>>> 3/2
1.5
>>> type(2/2)
<class 'float'>

사실 2.x에서는 int / int의 결과가 int로만 나와서 예상 밖의 결과가 나온 적이 많은데요,
이제는 그럴 일이 적어질 것 같습니다 :)

* String, Unicode 체계가 바뀌었습니다.

2.x에서는 아래 예제와 같이 string과 unicode로 구분이 되었습니다.

>>> type( '가' )         # 일반 string의 경우.
<type 'str'>

>>> type( '가'.decode('utf8') )          # 인코딩을 가지고 있는 스트링을 디코딩한 경우.
<type 'unicode'>

>>> type( u'가' )
<type 'unicode'>        # 유니코드의 경우.


그러나 3.0에서는 아래 예제와 같이 string과 byte로 구분이 됩니다.

>>> type(u'가')
SyntaxError: invalid syntax (<pyshell#13>, line 1)

>>> type('가')
<class 'str'>

>>> type('가'.encode('cp949'))
<class 'bytes'>

즉, 2.x에서는 일반 스트링이 인코딩이 있는 문자열이었고 unicode가 따로 있었는데,
3.0에서는 일반 스트링이 unicode와 동일하며, 인코딩이 있는 문자열은 bytes로 표현됩니다.


이 이외에도 자잘한 변경사항이 많습니다만, 너무 걱정하지 마세요.
2.x에서 3.0으로의 간편한 변환을 위해 2to3 스크립트가 제공된 답니다.
물론 만능은 아니지만 왠만한 코드는 자동으로 변환할 수 있습니다.

다음에는 이 2to3 스크립트에 대해서 한번 짚고 넘어가도록 해 보겠습니다.

AND