Python 2.x 이해하기

현재 대부분의 Python 코드는 표준적으로 3.6 이상의 버전을 사용하지만 간혹 2.x 버전의 코드를 읽어야 하는 상황이 생겨 일부 변경 사항을 정리해 보았다. 이곳에 작성되지 않은 변경 사항은 공식문서에서 확인할 수 있다. 

Python 2.7 실습: https://workat.tech/ide/online-python2-compiler

 

문자(열)

2.x: ASCII

3.x: UTF-8

2.x에서 UTF-8으로 인코딩하기 위해서는 아래 주석을 소스 코드 첫 줄에 작성해야 했다.

# -*- coding: utf-8 -*-

2.x의 unicode 자료형(u'...')은 3.x에서 binary(b'...')가 되었다. 그리고 str과 binary를 섞어서 사용할 수 없다. 

 

숫자

# 2.x
>>> 3 / 2
1
>>> 3.0 / 2.0
1.5

# 3.x
>>> 3 / 2
1.5

2.x에서는 int / int의 결괏값을 int로 가졌지만, 3.x에서는 자동으로 float를 반환할 수 있도록 계산한다. 

2.x에 존재하던 long 자료형은 int라는 이름으로 통일되었다. 

 

변화된 문법

# 2.x
def foo(a, (b, c)): 
    ...
    
# 3.x
def foo(a, b_c): 
    b, c = b_c
    ...
# 2.x
>>> 3 <> 4
True

# 3.x
>>> 3 != 4
True
# 2.x
print 'python'

# 3.x
print('python')
# 2.x
>>> r = raw_input("Input Integer: ")  # 입력된 값은 모두 str로 처리
Input Integer: 3
>>> r
'3'

>>> r = input("Input Integer: ")  # 입력된 값에 자료형이 달라짐
Input Integer: 3
>>> r
3


# 3.x
>>> r = raw_input("Input Integer: ")
NameError: name 'raw_input' is not defined

>>> r = input("Input Integer: ")  # 입력된 값은 모두 str로 처리
Input Integer: 3
>>> r
'3'

 

예외 처리

# 2.x
try:
    ...
except ValueError, err:
    print "Error:", err

# 3.x
try:
    ...
except ValueError as err:
    print("Error:", err)

2.x은 as 대신 ,(comma)를 이용해 발생한 예외를 받아올 수 있었다. 

2.x에 존재했던 StandardError가 삭제되었다. 

 

Views And Iterators

2.x 3.x
dict.keys(), dict.items(), dict.values()
 → list
→ 각각의 객체
dict.iterkeys(), dict.iteritems(), dict.itervalues() (지원하지 않음)
range list
xrange  객체
range  객체
map, filter → list → iterator

 

객체 비교

# 2.x
>>> 1 < ''
True
>>> None < None
False

# 3.x
>>> 1 < ''
TypeError: '<' not supported between instances of 'int' and 'str'
>>> None < None
TypeError: '<' not supported between instances of 'NoneType' and 'NoneType'

3.x은 같은 객체끼리(natural ordering)의 비교만 가능해졌다.