3.4 의존성과 패키징

실습 · 연습문제 1개

버전 제약 검사기 version-specifier

pyproject.toml의 의존성은 numpy>=1.23,<2.6처럼 버전 제약(version specifier)으로 쓴다. resolver는 후보 버전마다 이 제약을 검사한다. 함수 satisfies(version, spec)를 완성해, 버전이 제약을 만족하는지 판정한다.

  • spec은 쉼표로 구분한 조건의 목록이고, 모든 조건을 만족해야 True다. 조건 앞뒤의 공백은 무시한다.
  • 버전은 1.26.4처럼 점으로 구분한 정수만 다룬다(rc, dev 같은 사전 배포 표기는 다루지 않는다).
조건 의미
==1.26.4, !=1.26.4 같다, 다르다
>=, <=, >, < 크기 비교
==1.26.*, !=1.26.* 앞자리가 1.26인가(아닌가)
~=1.4.2 호환 릴리스(compatible release). >=1.4.2, ==1.4.*와 같다
~=2.2 >=2.2, ==2.*와 같다

규칙(Python 패키징 표준의 버전 규칙을 단순화한 것):

  1. 버전은 문자열이 아니라 정수의 tuple로 비교한다. 1.10은 1.9보다 크다.
  2. 길이가 다르면 짧은 쪽 뒤에 0을 채워 비교한다. 2.0과 2.0.0은 같다.
  3. ~=X.Y.Z는 >=X.Y.Z이면서 마지막 자리를 뺀 X.Y가 같은 버전이다.

예:

satisfies("1.4.10", "~=1.4.2")      # True
satisfies("1.5.0",  "~=1.4.2")      # False
satisfies("2.0.0",  "==2.0")        # True
satisfies("1.26.4", "==1.26.*")     # True
satisfies("2.6.0",  ">=1.23, <2.6") # False

테스트의 기대값은 Python 패키징 표준을 구현한 packaging 라이브러리의 판정과 같다.