퍼스널 컴퓨팅

“코드 깔끔하게 유지하기” 파이썬 형식 검사기 4가지

Serdar Yegulalp | InfoWorld 2023.03.14
처음에 파이썬에는 형식 양식(type decoration)이란 것이 없었다. 빠르고 다루기 쉬운 언어라는 파이썬의 전체적인 목표와 부합하기도 했다. 유연한 객체 형식은 코드 작성의 복잡다단한 부분을 포용하고 개발자가 코드를 간결하게 유지하는 데 도움이 된다. 
 
ⓒ Getty Image Bank

그러나 지난 몇 년 사이 파이썬에 형식 주석이 추가되면서 개발 중 파이썬 형식을 검사하는 소프트웨어가 등장했다. 파이썬은 (적어도 아직은) 런타임에서 형식을 검사하지 않는다. 그러나 좋은 형식 검사기를 활용하면 IDE에서 파이썬의 형식 주석을 사용해 많은 일반적인 실수를 프로덕션에 이르기 전에 걸러낼 수 있다. 

여기서는 파이썬용 주요 형식 검사 애드온 4가지를 살펴본다. 패턴은 4가지 모두 비슷해서, 파이썬 코드에서 형식 주석을 검사하고 피드백을 제공한다. 또한 이 기본 개념을 바탕으로 각각 고유한 기능을 부가적으로 제공한다. 
 

마이파이

마이파이(Mypy)는 원래 드롭박스(Dropbox)에서 내부 코드베이스를 최적화하기 위해 개발했다. 파이썬용 최초의 정적 형식 검사 시스템이라고 할 수 있다. 2012년부터 개발을 시작해 지금도 활발한 개선되고 있다. 기본적으로 서드파티 형식 검사 라이브러리가 파이썬에서 작동하는 방식을 규정하는 프로토타입으로, 이후 다른 많은 형식 검사기가 등장해 마이파이를 기반으로 확장됐다. 

마이파이는 독립적으로 또는 명령줄에서 실행하거나 편집기나 IDE의 린터와 통합해 사용할 수 있다. 많은 편집기와 IDE가 마이파이 통합 기능을 제공한다. 비주얼 스튜디오 코드의 파이썬 확장에서는 바로 작동한다. 마이파이를 실행하면 코드가 제공하는 형식 정보를 기반으로 코드의 일관성에 대한 보고서가 생성된다. 

코드에 형식 주석이 없는 경우 마이파이의 코드 검사 기능 대부분이 실행되지 않는다. 따라서 코드베이스에 점진적으로 주석을 추가하는 중이라면 형식 검사를 하지 않는 코드에 시간을 낭비할 일이 없다. 마이파이를 사용해 주석이 없는 코드에 수동으로 플래그를 지정할 수는 있다. 필요에 따라 플래그 지정의 엄격함 수준을 다양하게 설정할 수 있다. 

코드베이스를 처음부터 시작하면서 우선 공격적인 린팅 전략을 원하는 경우 --strict 옵션을 사용해 형식 미지정 코드를 방지할 수 있다. 반면 형식 정의가 별로 없는 레거시 코드베이스를 다루는 경우에는 --disallow-untyped-defs로 형식 미지정 함수 정의만 방지하면서 다른 형식 미지정 코드는 허용하는 등 더 느슨한 옵션을 사용할 수 있다. 또한 언제든 # type: ignore와 같은 인라인 주석을 사용해 개별 라인을 플래그에서 배제할 수 있다. 

모듈의 공용 인터페이스에 형식 힌트를 사용하려는 경우 마이파이에서 PEP 484 스텁 파일을 사용할 수 있다. 또한 마이파이는 기존 코드에서 자동으로 스텁 파일을 생성하는 툴인 stubgen도 제공한다. 형식 미지정 코드의 경우 스텁 파일은 제네릭 형식을 사용하므로 나중에 필요에 따라 마크업하면 된다. 

마이파이에는 형식 양식이 있는 파이썬을 C 모듈로 컴파일하는 mypyc라는 툴도 포함돼 있다. 이 툴은 형식 양식이 있는 코드베이스의 속도를 높여주므로 형식 주석을 사용해 파이썬을 더 빠른 언어로 만들기 위해 실험적 방법으로 고려할 만하다. 다만 mypyc는 머신 네이티브 형식에 대한 주석은 허용하지 않으므로 사이썬(Cython) 만큼 속도를 높여주지는 못한다. 반면 사이썬은 맞춤형 구문을 사용하므로 대부분의 린터와 호환되지 않는다. 
 

파이타입

파이타입(Pytype)은 구글에서 만들었으며, 형식 설명자 대신 추론을 사용한다는 면에서 마이파이 등과 구분된다. 즉, 파이타입은 엄격히 형식 주석에만 의존하는 것이 아니라 코드 흐름을 분석해 형식을 판단한다. 

파이타입은 대체로 관대한 편이다. 연산이 런타임에 잘 작동하고 주석에 모순되지 않는다면 그냥 넘어간다. 그러나 이 말은 플래그를 지정해야 하는 일부 문제가 개발자 모르게 그냥 넘어간다는 것을 의미한다. 예를 들어 한 시점에서 형식을 사용해 변수를 선언한 다음 같은 컨텍스트에서 다시 정의하는 경우가 있다. 이 문제는 곧 수정될 예정이다.

코드에 형식 주석을 추가하기로 한다면 파이타입의 reveal_type 함수가 특히 유용하다. reveal_type(expr)이라는 구문을 코드에 삽입하면 파이타입은 expr을 평가하고 형식을 설명하는 알림을 생성한다. 

참고로 특정 파이타입 동작은 코드 자체에 특성을 추가하는 방식으로 제어된다. 예를 들어 파이타입이 누락된 특성 또는 동적으로 설정되는 모듈 멤버에 대해 메시지를 표시하지 않도록 하려면 파이타입 구성 메타데이터에 설정하는 것이 아니라 해당 클래스 또는 모듈에 _HAS_DYNAMIC_ATTRIBUTES = True를 추가하면 된다.
 

파이라이트와 파이랜스

파이라이트(Pyright)는 마이크로소프트의 파이썬 형식 검사기로, 비주얼 스튜디오 코드용 파이랜스(Pylance) 확장에 포함된다. 이미 VS 코드 사용자라면 파이랜스 확장이 파이라이트를 다루는 가장 편리한 방법이다. 설치만 하면 바로 사용할 수 있다. 파이라이트는 우수한 올인원 형식 검사 및 코드 린팅 환경을 제공하며 앞서 소개한 파이썬 분석 툴의 편의성과 고급 기능도 대부분 지원한다.

파이라이트는 파이타입과 마찬가지로 형식 정보가 없는 코드베이스에서도 작동한다. 형식 정보가 없으면 파이라이트는 최선의 노력을 다해 현재 적용되는 형식을 추론한다. 따라서 형식 선언이 없는 오래된 코드베이스에서도 파이타입으로 좋은 결과를 얻을 수 있다. 코드에 점진적으로 형식 주석을 추가하면 시간이 지날수록 더 좋은 결과를 얻게 된다. 

파이라이트는 실제 파이썬 프로젝트의 설계를 보완하는 방식에 있어 매우 유연하다. 다른 형식 검사기와 마찬가지로 프로젝트 디렉터리에 위치하는 JSON 형식의 구성 파일을 사용해 프로젝트별로 구성하거나, [tool.pyright] 섹션의 pyproject.toml 파일의 일부로 구성할 수 있다. 구성 파일에서 개별 경로를 제외하거나(검사되지 않음) 무시할 수 있다(오류와 경고가 표시되지 않음). 

VS 코드에서 여러 루트가 있는 작업 공간은 각각 자체 파이라이트 구성을 둘 수 있다. 프로젝트의 각 부분에 서로 다른 린팅 구성이 필요한 경우를 대비해서다. 같은 맥락에서, 한 프로젝트 내에 각각 자체 venv 또는 가져오기 경로가 있는 여러 “실행 환경”을 정의할 수 있다. 전반적으로 보면 파이라이트는 여기서 소개한 린터 중 가장 세분화됐다.
 

파이어

페이스북과 인스타그램의 개발자들이 만든 파이어(Pyre)는 사실 형식 검사기인 파이어와 정적 코드 분석 툴인 파이사(Pysa), 두 개의 툴이 하나로 합쳐진 것이다. 두 툴은 함께 작동해 다른 툴보다 더 높은 수준의 검사 및 분석 기능을 제공하지만, 제대로 활용하려면 개발자가 직접 해야 할 일이 몇 가지 있다. 

파이어의 접근 방법은 파이타입, 마이파이와 비슷하다. 형식 미지정 코드는 형식 지정 코드에 비해 더 관대하게 취급되므로 형식 미지정 파이썬 코드베이스로 시작해서 함수별, 모듈별로 주석을 추가할 수 있다. 모듈에서 “엄격 모드(strict mode)”를 켜면 파이어는 모든 주석 누락에 플래그를 지정한다. 또는 엄격 모드를 기본값으로 설정하고 모듈 수준에서 빠져나올 수 있다. 파이어는 .pyi 형식 스텁 파일과도 호환된다. 

파이어에는 코드베이스를 형식 지정 포맷으로 마이그레이션하기 위한 강력한 기능이 있다. infer 명령줄 옵션은 파일 또는 디렉터리를 읽고 사용된 형식을 경험에 근거해 추정하고 파일에 주석을 적용한다. 단, 먼저 코드를 백업하는 것이 좋다! (실행 중인 파이썬 프로그램으로부터 형식 정보를 얻으려면 또 다른 페이스북/인스타그램 프로젝트인 몽키타입(MonkeyType)을 사용하면 된다.) 

파이어의 기능은 여기서 소개한 다른 패키지와 비슷하지만 파이사(Pysa)는 다르다. 파이사는 코드에 대해 “오염 분석(taint analysis)”을 수행해 잠재적인 보안 문제를 파악하며, 특정 소프트웨어 구성요소의 흐름 분석 라이브러리를 활용하고 취약한 것으로 보이는 코드에 플래그를 지정한다. 이 코드와 접촉하는 모든 요소에도 오염 플래그가 지정되지만 데이터를 삭제하고 오염 그래프에서 해당 데이터를 제거하는 구성요소를 지정할 수 있다. 

한 가지 번거로운 점은 파이사의 서드파티 구성요소 오염 분석 라이브러리의 규모가 아직 크지 않아서 자체 모델을 만들어야 할 수도 있다는 점이다. 그러나 오염 분석의 상당수는 일반적인 파일 시스템 문제에 대한 분석은 물론 장고(Django) 웹 프레임워크, SQL 알케미(Alchemy) ORM, 판다스(Pandas) 데이터 과학 라이브러리와 같이 광범위하게 사용되는 소프트웨어를 대상으로 작동한다. 
editor@itworld.co.kr

회사명 : 한국IDG | 제호: ITWorld | 주소 : 서울시 중구 세종대로 23, 4층 우)04512
| 등록번호 : 서울 아00743 등록발행일자 : 2009년 01월 19일

발행인 : 박형미 | 편집인 : 박재곤 | 청소년보호책임자 : 한정규
| 사업자 등록번호 : 214-87-22467 Tel : 02-558-6950

Copyright © 2024 International Data Group. All rights reserved.