2011년 5월 13일 금요일

파이썬 2.7과 3.x 사이에서 폐기되는 것

원문: Deprecations between Python 2.7 and 3.x (날짜: 2011-03-28, 작성자: Paul Moore)

최근에 python-dev에서 있었던 논의에서 파이썬의 현재 폐기(deprecation) 정책이 파이썬 2.7에서 파이썬 3.x의 현재 버전으로 옮겨가려는 개발자를 고려해야 하는 문제가 부각되었습니다. 이 논의의 결과로 파이썬 사용자가 보통은 파이썬 2.7에서 3.x의 구 버전을 거치지 않고 바로 최신 버전으로 옮겨갈 것이라는 점을 고려하게 되어 현재의 폐기 정책을 수정하게 되었습니다.

배경

파이썬은 하위 호환성에 상당히 공을 들입니다. 요컨대 올바른 프로그램이라면 새 버전의 파이썬에서도 동작해야 한다는 호환성 가이드라인(compatibility guideline)을 지키지 않으면, 어떤 변경도 할 수 없습니다. 그러나 항상 그럴 수만은 없는데, 예를 들면 API가 잘못된(broken) 것이 명확하여 다른 것으로 바꿔야 할 때가 있습니다. 이럴 때에 파이썬은 제거될 기능을 공식적으로 폐기하기 위해 1년간 과도기를 두는 폐기 정책을 따릅니다. 그 과도기에는 개발자들이 코드를 고칠 시간을 가질 수 있도록 폐기 경고를 발생시켜야 합니다. 파이썬의 폐기 정책에 대한 완전한 설명은 PEP 5에 기록되어 있습니다. 변경은 새로운 파이썬 릴리스에서만 할 수 있기 때문에, 보통 릴리스 사이의 18개월의 간격이 바로 한 릴리스라는 유예 기간 기준이 됩니다.

파이썬 3은 이 정책에서 예외였습니다. 파이썬 2에서 파이썬 3으로 주 버전이 변경된 것은 특별히 하위 호환성을 깨뜨리는 변경을 허용하여, 파이썬 개발자가 기존의 정책 내에서는 간단히 고칠 수 없었던 문제들을 해결할 기회를 주기 위함이었습니다. 여기에는 예를 들면, 기본 문자열을 유니코드로 하는 것이나 리스트 대신 이터레이터를 반환하는 것 등이 있습니다.

병렬 버전 개발

파이썬 3으로 옮겨가려면 시간이 좀 걸릴 것이므로 (많은 이들이 5년으로 예상) 어느 정도는 2와 3을 동시에 개발해야 할 것입니다.

파이썬 2.7이 파이썬 2의 최종 릴리스가 되었기 때문에 그 유지 보수 기간이 상당 기간 연장되어야 함은 모두가 동의하였습니다. 최종적으로 새 버전의 파이썬으로 옮겨가고자 하는 개발자는 파이썬 3으로 가야 할 것입니다.

여기에는 문제가 좀 있습니다...

갑자기 폐기된 것

누군가 python-dev의 한 스레드에서 C API의 PyCObject_AsVoidPtr 함수가 충분한 경고 없이 제거되어 버렸다는 점을 지적했습니다. 하지만, 이것은 폐기 정책에 의해 보호되어야 했던 것입니다. 무슨 일이 일어난 것일까요?

이 변경은 예전 API(PyCObject)에서 새롭게 개선된 API(PyCapsule)로 이전하는 커다란 변화의 일부였습니다. 문제는 PyCObject는 파이썬 2.6에서 기본값이자 쓸 수 있는 유일한 API라는 것입니다. 파이썬 2.7에서는 폐기가 예정(deprecated) 되었습니다. 파이썬 3.2에서는 그 API는 없어지고 새로운 PyCapsule을 사용해야 합니다. 즉, 파이썬 2.7의 릴리스(2010년 7월)에서 파이썬 3.2의 릴리스(2011년 2월)까지 약 7개월의 유예 기간이 주어지게 됩니다. 이것은 최소로 규정된 12개월 기간보다 훨씬 적어서 개발자들이 적정한 범위의 파이썬 릴리스를 지원하기가 어렵게 됩니다.

파이썬 3.0에서 3.1 그 다음 3.2로 옮겨가고자 하는 사람에게는 이 폐기 계획이 이상이 없습니다. 2010년 3월에 파이썬 3.1이 위 내용을 폐기 예정으로 하여 릴리스되었으므로 파이썬 3.x 릴리스 시리즈에서는 유예 기간이 거의 12개월이 됩니다. 그러나 실제로는 사람들이 이렇게 가지 않습니다. 사람들은 2.7에서 바로 3.x의 최신, 이 경우 3.2로 갑니다. 그래서 이러한 문제가 생깁니다. 결코 파이썬 개발자의 의도는 아니지만, PEP 5는 둘 모두가 활발히 개발되는 병렬 버전의 파이썬을 염두해두고 작성한 것이 아닙니다.

그럼 어떻게 할까요?

PyCObject/PyCapsule API가 깨진 것은 확실히 문제입니다만, 피해 가는 것이 불가능한 것은 아닙니다. 다만, 최소한 python-dev에 글을 올렸던 사람에게는 어려운 문제였습니다. 종합해볼 때 이 문제는 생기지 말았어야 했습니다.

PyCObject/PyCapsule에 대해서는 이미 문제가 발생해버려 할 수 있는 것이 별로 없습니다. PyCObject를 다시 부활시키는 것도 그저 비호환성 더하는 것뿐이라 적절한 선택이 아니었습니다. 일반적인 견해는 좀 귀찮더라도 어느 쪽 API든 사용 가능한 쪽을 쓰도록 코드를 작성하는 것이 가능했다는 것입니다. 실제로 파이썬 3.1에서는 PyCObjectPyCapsule API를 감싼 것으로 작성되어 있습니다. 필요하다면 파이썬 3.1의 구현을 외부 코드에서 사용할 수 있게 추출해낼 수도 있을 것이라는 의견도 있었습니다. 아울러 이번 변경의 원인을 설명하고 개발자가 이전하는 것을 돕는 자료를 문서로 만들 필요가 있으므로, 해당 변경 사항을 다루는 "소급하는" PEP를 작성해야 할 것이라고 의견이 모였습니다.

한 가지 덧붙이자면, 파이썬 개발팀은 이제 이런 문제를 인식하였으며 재발하지 않도록 노력하리라는 것입니다. Guido는 이 상황에 대한 글을 올리고 당분간 파이썬 3에서 폐기는 보수적으로 사용할 것을 제안하였습니다. 적어도 개발자들이 2.7에서 옮겨올 수 있는 길을 열어주기 위해서라도 폐기 예정된 API는 제거되기 전까지 상당히 오랫동안 유지될 것입니다.

위 스레드에서는 파이썬의 변화를 어떻게 더 효과적이고 더욱 시의적절하게 더 많은 대중에게 전달할 수 있을지에 대한 문제가 간접적으로 제기되었습니다. 이 블로그는 바로 그 문제를 다루기 위해서 만들어진 것입니다.

이게 다 무슨 말인가요?

일단 무엇보다도, 파이썬 개발자가 항상 모든 것을 똑바로 하는 것은 아니라는 말입니다. 아무도 개발자를 힘들게 하려는 것은 아니었습니다. 단지 제때에 발견하지 못한 것뿐입니다.

두 번째로, 문제를 고치는 것이 오히려 해가 될 수 있으므로, PyCObject API를 다시 부활시키지는 않습니다. 부활시킨다면 그 변화 때문에 타격이 있었던 개발자들에게는 도움이 될지 몰라도, 전체적으로는 호환성 문제를 더 복잡하게 만들어 버릴 것입니다. 당분간은 이 문제를 참고 견디어 나가야만 합니다. 여기에서 얻은 교훈으로 다음에는 같은 실수를 하지 않을 것입니다.

이 문제가 보여주는 바는 파이썬 개발팀은 사용자의 목소리를 듣길 원한다는 것입니다. 호환성은 아주 중요하고, 가능한 힘들지 않게 새 버전으로 옮겨갈 수 있도록 열심히 노력하고 있습니다. 특히, 라이브러리 개발자는 어느 정도 수고를 들여서라도 여러 버전의 파이썬을 지원할 수 있어야 합니다.

마지막으로, 개발자는 2.7을 버리지 않았다는 것입니다. 새 기능이 추가되지는 않을 것이고 2.8도 없을 것이지만, 2.7을 사용하는 사람들의 관점은 여전히 중요합니다. 사용자들에게 자신들이 준비되면 3.x로 옮겨갈 수 있다는 확신을 주는 것은 전체 파이썬 커뮤니티에 꼭 필요한 일입니다.

댓글 없음:

댓글 쓰기