Python 3로 수동으로 옮겨가기

2020년 7월 3일 수정

이 글은 별 다른 도구 없이 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:
    ...

이름이나 구조가 바뀐 모듈들

예를 들자면 이런 것들이 있다.

  • Queuequeue.Queue 로 소속이 바뀌었다.
  • urlparseurllib.parse 로 이름과 소속이 바뀌었다.
  • StringIOio.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(...))