Python 3로 수동으로 옮겨가기
2020년 7월 3일 수정
≡ 목차 (Table of Contents)
이 글은 별 다른 도구 없이 Python 2.x 코드를 Python 3.x 코드로 옮길 때 개인적으로 겪었던 문제점 및 해결법을 간단하게 메모하는 글이다.
print 함수
print가 함수 형태로 바뀌었다.
print "foo", bar
위 코드는 아래 처럼 수정해야 한다.
print("foo", bar)
Long?
123456678L
처럼 긴 정수를 표현할 때 끝에 L
을 붙이는 경우도 있었는데 3.x 에서는 이렇게 하면 오히려 오류가 난다. 모든 큰 정수는 자동으로 BIG INTEGER가 되니 걱정하지 말고 L
을 떼어내자.
except 문법 변경
예외처리 시 상세한 예외 정보를 받는 인터페이스가 바뀌었다.
except SomeException, e:
...
위 코드는 아래 처럼 수정해야 한다.
except SomeException as e: ...
다중 예외 처리도 비슷하다.
except (FooException, BarException) as e: ...
이름이나 구조가 바뀐 모듈들
예를 들자면 이런 것들이 있다.
Queue
는queue.Queue
로 소속이 바뀌었다.urlparse
는urllib.parse
로 이름과 소속이 바뀌었다.StringIO
는io.StringIO
로 소속이 바뀌었다.
유니코드?
일단 다짜고짜 에러 메시지부터 보자.
TypeError: Unicode-objects must be encoded before hashing
위 오류는 아래 코드에서 발생했다.
md5('some string').hexdigest()
에러 메시지를 보면 알 수 있겠지만 이 경우 인코딩을 명시하면 해결된다.
md5('some string'.encode('utf-8')).hexdigest()
사라진 xrange
성능 때문에 사용하던 xrange
가 사라졌다. 이제 그냥 range
를 맘 놓고(?) 쓰면 된다.
리스트 형태로 받고 싶다면 당연히 리스트로 변환해서 쓰면 된다.
list(range(...))