importlib.metadata – 패키지 메타데이터 액세스¶
Added in version 3.8.
버전 3.10에서 변경: importlib.metadata는 더는 잠정적이지 않습니다.
Source code: Lib/importlib/metadata/__init__.py
importlib.metadata 는 설치된 배포 패키지 의 메타데이터(진입점 또는 최상위 이름(임포트 패키지 <https://packaging.python.org/en/latest/glossary/#term-Import-Package>`_s, 모듈 등)과 같은 정보 포함)에 접근할 수 있게 해주는 라이브러리입니다. Python의 임포트 시스템을 기반으로 구축된 이 라이브러리는 현재 삭제된 ``pkg_resources` 패키지에서 제공하던 진입점 및 메타데이터 API를 제공합니다. importlib.resources 와 함께, 이는 pkg_resources 를 대체합니다.
importlib.metadata 는 pip 와 같은 도구를 통해 Python의 site-packages 디렉터리에 설치된 제3자 배포 패키지 를 대상으로 작동합니다. 구체적으로, 발견 가능한 dist-info 또는 egg-info 디렉터리가 있고 Core metadata specifications 에 의해 정의된 메타데이터가 있는 배포판과 함께 작동합니다.
중요
이들은 Python 코드 내에서 임포트할 수 있는 최상위 임포트 패키지 이름과 반드시 동일하거나 일대일로 대응하지는 않습니다. 하나의 배포 패키지 가 여러 개의 임포트 패키지 (및 단일 모듈)를 포함할 수 있으며, 하나 이상의 최상위 임포트 패키지 가 네임스페이스 패키지인 경우 여러 개의 배포 패키지 에 매핑될 수 있습니다. 두 항목 간의 매핑을 얻으려면 packages_distributions() 를 사용할 수 있습니다.
기본적으로 배포 메타데이터는 파일 시스템이나 sys.path 에 있는 zip 아카이브에 위치할 수 있습니다. 확장 매커니즘을 통해 메타데이터는 거의 어디에나 존재할 수 있습니다.
더 보기
- https://importlib-metadata.readthedocs.io/
importlib.metadata의 백포트를 제공하는importlib_metadata에 대한 설명서입니다. 여기에는 이 모듈의 클래스와 함수를 위한 API 참조 <https://importlib-metadata.readthedocs.io/en/latest/api.html>`__와 기존 ``pkg_resources` 사용자들을 위한 ` 마이그레이션 가이드 <https://importlib-metadata.readthedocs.io/en/latest/migration.html>`__가 포함되어 있습니다.
개요¶
pip 을 사용하여 설치한 배포 패키지 의 버전 문자열을 얻고 싶다고 가정해 보겠습니다. 먼저 가상 환경을 생성하고 무언가를 설치하는 것부터 시작합니다.
$ python -m venv example
$ source example/bin/activate
(example) $ python -m pip install wheel
다음을 실행하여 wheel에 대한 버전 문자열을 얻을 수 있습니다:
(example) $ python
>>> from importlib.metadata import version
>>> version('wheel')
'0.32.3'
또한 console_scripts, distutils.commands 등과 같이 EntryPoint의 속성(일반적으로 ‘group’ 또는 ‘name’)으로 선택 가능한 진입 지점 모음을 가져올 수 있습니다. 각 그룹은 EntryPoint 객체들의 모음을 포함합니다.
여러분은 배포 메타데이터를 얻을 수 있습니다:
>>> list(metadata('wheel'))
['Metadata-Version', 'Name', 'Version', 'Summary', 'Home-page', 'Author', 'Author-email', 'Maintainer', 'Maintainer-email', 'License', 'Project-URL', 'Project-URL', 'Project-URL', 'Keywords', 'Platform', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Requires-Python', 'Provides-Extra', 'Requires-Dist', 'Requires-Dist']
또한 배포의 버전 번호를 가져오고, 구성 파일을 나열하고, 배포의 요구사항 리스트를 얻을 수 있습니다.
- exception importlib.metadata.PackageNotFoundError¶
현재 Python 환경에 설치되지 않은 배포 패키지를 조회할 때 이 모듈의 여러 함수에서 발생하는
ModuleNotFoundError의 하위 클래스입니다.
- exception importlib.metadata.MetadataNotFound¶
비어 있거나 메타데이터 파일이 포함되어 있지 않은 배포 폴더에서 메타데이터를 불러오려고 할 때 발생하는
FileNotFoundError의 하위 클래스입니다.
기능적 API¶
이 패키지는 공용 API를 통해 다음과 같은 기능을 제공합니다.
진입 지점¶
- importlib.metadata.entry_points(**select_params)¶
현재 환경의 진입 지점을 설명하는
EntryPoints인스턴스를 반환합니다. 제공된 키워드 매개변수는 개별 진입 지점 정의의 속성과 비교하기 위해select()메서드로 전달됩니다.참고:
EntryPoint.dist속성을 기반으로 진입 지점을 조회하려면 대신Distribution.entry_points()를 사용하십시오(서로 다른Distribution인스턴스는 현재 동일한 속성을 가지고 있더라도 서로 같다고 비교되지 않기 때문입니다).
- class importlib.metadata.EntryPoints¶
설치된 진입 지점 모음의 상세 정보입니다.
또한 식별된 모든 진입 지점 그룹을 보고하는
.groups속성과 식별된 모든 진입 지점 이름을 보고하는.names속성을 제공합니다.
- class importlib.metadata.EntryPoint¶
설치된 진입 지점의 상세 정보입니다.
각
EntryPoint인스턴스에는.name,.group및.value어트리뷰트가 있고 값을 결정하는.load()메서드가 있습니다..value어트리뷰트의 구성 요소를 가져오기 위한.module,.attr및.extras어트리뷰트도 있으며,.dist는 진입 지점을 제공하는 배포 패키지에 대한 정보를 얻는데 사용됩니다.
모든 진입 지점을 조회합니다:
>>> eps = entry_points()
entry_points() 함수는 편리함을 위해 names 및 groups 속성을 가진 모든 EntryPoint 객체들의 모음인 EntryPoints 객체를 반환합니다:
>>> sorted(eps.groups)
['console_scripts', 'distutils.commands', 'distutils.setup_keywords', 'egg_info.writers', 'setuptools.installation']
EntryPoints`는 특정 속성에 부합하는 진입 지점을 선택하는 :meth:!select` 메서드를 가지고 있습니다. console_scripts 그룹 내의 진입 지점들을 선택해 보십시오:
>>> scripts = eps.select(group='console_scripts')
동등하게, entry_points() 가 키워드 인수를 select로 전달하므로 다음과 같이도 가능합니다:
>>> scripts = entry_points(group='console_scripts')
“wheel”이라는 이름의 특정 스크립트를 선택(wheel 프로젝트에서 발견됨):
>>> 'wheel' in scripts.names
True
>>> wheel = scripts['wheel']
동등하게, 선택 과정 중에 해당 진입 지점을 조회하십시오:
>>> (wheel,) = entry_points(group='console_scripts', name='wheel')
>>> (wheel,) = entry_points().select(group='console_scripts', name='wheel')
해결된 진입 지점을 검사합니다:
>>> wheel
EntryPoint(name='wheel', value='wheel.cli:main', group='console_scripts')
>>> wheel.module
'wheel.cli'
>>> wheel.attr
'main'
>>> wheel.extras
[]
>>> main = wheel.load()
>>> main
<function main at 0x103528488>
group 과 name 은 패키지 제작자가 정의한 임의의 값이며, 일반적으로 클라이언트는 특정 그룹에 속한 모든 진입 지점을 확인하고자 할 것입니다. 진입 지점의 정의 및 사용에 대한 자세한 정보는 setuptools 문서 를 읽어보십시오.
버전 3.12에서 변경: “선택 가능한(selectable)” 진입 지점은 importlib_metadata 3.6 및 Python 3.10에서 도입되었습니다. 해당 변경 전에는 entry_points 가 매개변수를 허용하지 않았으며 항상 그룹을 키로 하는 진입 지점 딕셔너리를 반환했습니다. importlib_metadata 5.0 및 Python 3.12부터는 entry_points 가 항상 EntryPoints 객체를 반환합니다. 호환성 옵션은 backports.entry_points_selectable 을 참조하십시오.
버전 3.13에서 변경: EntryPoint 객체는 더 이상 튜플과 유사한 인터페이스(__getitem__())를 제공하지 않습니다.
배포 메타데이터¶
- importlib.metadata.metadata(distribution_name)¶
이름이 지정된 배포 패키지에 해당하는 배포 메타데이터를
PackageMetadata인스턴스로 반환합니다.이름이 지정된 배포 패키지가 현재 Python 환경에 설치되어 있지 않으면
PackageNotFoundError를 발생시킵니다.배포 패키지는 존재하지만 METADATA 파일이 없는 경우
MetadataNotFound를 발생시킵니다.
- class importlib.metadata.PackageMetadata¶
PackageMetadata protocol 의 구체적인 구현체입니다.
정의된 프로토콜 메서드와 어트리뷰트를 제공할 뿐만 아니라, 인스턴스를 인덱싱하는 것은
get()메서드를 호출하는 것과 동일합니다.
모든 배포 패키지는 metadata() 함수를 사용하여 추출할 수 있는 몇 가지 메타 데이터가 포함되어 있습니다:
>>> wheel_metadata = metadata('wheel')
반환된 데이터 구조의 키는 메타데이터 키워드의 이름을 지정하고, 값은 배포 메타데이터에서 구문 분석하지 않은 채로 반환됩니다:
>>> wheel_metadata['Requires-Python']
'>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*'
PackageMetadata`는 또한 :PEP:`566`에 따라 모든 메타데이터를 JSON 호환 형식으로 반환하는 :attr:!json` 어트리뷰트를 제공합니다.
>>> wheel_metadata.json['requires_python']
'>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*'
사용 가능한 메타데이터 전체 집합은 여기서 설명하지 않습니다. 자세한 내용은 PyPA의 Core metadata specification 를 참조하십시오.
버전 3.15에서 변경: 이전에는 부수적으로, 배포에서 METADATA 파일이 누락된 경우 빈 METADATA 파일과 구별할 수 없는 빈 PackageMetadata``가 반환되었습니다. 이제는 METADATA 파일이 없으면 ``MetadataNotFound 예외가 발생합니다.
버전 3.10에서 변경: 이제 페이로드를 통해 제공될 때 Description 이 메타데이터에 포함됩니다. 줄 바꿈 문자는 제거되었습니다.
json 어트리뷰트가 추가되었습니다.
배포 버전¶
- importlib.metadata.version(distribution_name)¶
Return the installed distribution package version for the named distribution package.
이름이 지정된 배포 패키지가 현재 Python 환경에 설치되어 있지 않으면
PackageNotFoundError를 발생시킵니다.
version() 함수는 배포 패키지의 버전 번호를 문자열로 가져오는 가장 빠른 방법입니다:
>>> version('wheel')
'0.32.3'
배포 파일¶
- importlib.metadata.files(distribution_name)¶
이름이 지정된 배포 패키지에 포함된 전체 파일 세트를
PackagePath인스턴스로 반환합니다.이름이 지정된 배포 패키지가 현재 Python 환경에 설치되어 있지 않으면
PackageNotFoundError를 발생시킵니다.배포는 찾았으나 배포 패키지와 관련된 파일을 보고하는 설치 데이터베이스 기록이 없는 경우
None을 반환합니다.
- class importlib.metadata.PackagePath¶
해당 파일에 대한 배포 패키지의 설치 메타데이터에 해당하는 추가적인
dist,size,hash프로퍼티를 가진pathlib.PurePath파생 객체이며, 또한:- locate()¶
가능하면 데이터에 접근할 수 있는 구체적인
SimplePath를 반환하고, 그렇지 않으면NotImplementedError를 발생시킵니다.
- class importlib.metadata.SimplePath¶
exists()확인,joinpath()및parent를 사용한 탐색,read_text()및read_bytes()를 통한 데이터 조회가 가능한pathlib.Path의 최소 부분 집합을 나타내는 프로토콜입니다.
files() 함수는 배포 패키지 이름을 받아 이 배포로 설치된 모든 파일을 반환합니다. 예를 들어:
>>> util = [p for p in files('wheel') if 'util.py' in str(p)][0]
>>> util
PackagePath('wheel/util.py')
>>> util.size
859
>>> util.dist
<importlib.metadata._hooks.PathDistribution object at 0x101e0cef0>
>>> util.hash
<FileHash mode: sha256 value: bYkw5oMccfazVCoYQwKkkemoVyMAFoR34mmKBx8R1NI>
일단 파일을 얻으면, 내용을 읽을 수도 있습니다:
>>> print(util.read_text())
import base64
import sys
...
def as_bytes(s):
if isinstance(s, text_type):
return s.encode('utf-8')
return s
locate() 메서드를 사용하여 파일의 절대 경로를 가져올 수도 있습니다:
>>> util.locate()
PosixPath('/home/gustav/example/lib/site-packages/wheel/util.py')
메타 데이터 파일 목록 파일(RECORD나 SOURCES.txt)이 누락된 경우, files()는 None을 반환합니다. 대상 배포에 메타 데이터가 있음이 알려지지 않았을 때, 이 조건에 대한 보호로 호출자는 files()에 대한 호출을 always_iterable이나 다른 것으로 감쌀 수 있습니다.
배포 요구 사항¶
- importlib.metadata.requires(distribution_name)¶
이름이 지정된 배포 패키지에 대해 선언된 의존성 명세자를 반환합니다.
이름이 지정된 배포 패키지가 현재 Python 환경에 설치되어 있지 않으면
PackageNotFoundError를 발생시킵니다.
배포 패키지의 전체 요구 사항을 얻으려면, requires() 함수를 사용하십시오:
>>> requires('wheel')
["pytest (>=3.0.0) ; extra == 'test'", "pytest-cov ; extra == 'test'"]
임포트를 배포 패키지로 매핑¶
- importlib.metadata.packages_distributions()¶
sys.meta_path를 통해 찾은 최상위 모듈 및 임포트 패키지 이름을 해당 파일을 제공하는 배포 패키지의 이름(있는 경우)으로 매핑한 결과를 반환합니다.네임스페이스 패키지(여러 배포 패키지에 의해 구성 요소가 제공될 수 있음)를 지원하기 위해, 각 최상위 임포트 이름은 단일 이름으로 직접 매핑되지 않고 배포 이름의 리스트로 매핑됩니다.
각 임포트 가능한 최상위 파이썬 모듈 또는 임포트 패키지 <https://packaging.python.org/en/latest/glossary/#term-Import-Package>`_를 제공하는 `배포 패키지 이름(네임스페이스 패키지의 경우 여러 개)을 해결하는 편리한 메서드입니다:
>>> packages_distributions()
{'importlib_metadata': ['importlib-metadata'], 'yaml': ['PyYAML'], 'jaraco': ['jaraco.classes', 'jaraco.functools'], ...}
일부 편집 가능(editable) 설치는 최상위 이름을 제공하지 않으며 이로 인해 이 함수는 그러한 설치에서 신뢰할 수 없습니다.
Added in version 3.10.
배포¶
위에 설명된 모듈 수준 API가 가장 일반적이고 편리한 사용법이지만, 해당 정보는 모두 Distribution 클래스에서 접근할 수 있습니다. Distribution 은 파이썬 배포 패키지 의 메타데이터를 나타내는 추상 객체입니다. distribution() 함수를 호출하여 설치된 배포 패키지에 대한 구체적인 Distribution 서브클래스 인스턴스를 얻을 수 있습니다:
>>> from importlib.metadata import distribution
>>> dist = distribution('wheel')
>>> type(dist)
<class 'importlib.metadata.PathDistribution'>
- importlib.metadata.distribution(distribution_name)¶
이름이 지정된 배포 패키지를 설명하는
Distribution인스턴스를 반환합니다.이름이 지정된 배포 패키지가 현재 Python 환경에 설치되어 있지 않으면
PackageNotFoundError를 발생시킵니다.
따라서, 예를 들어 버전 번호를 가져오는 다른 방법은 Distribution.version 어트리뷰트를 통한 것입니다:
>>> dist.version
'0.32.3'
entry_points() 및 files() 의 경우도 동일하게 적용됩니다.
- class importlib.metadata.Distribution¶
설치된 배포 패키지의 상세 정보.
참고: 서로 다른
Distribution인스턴스는 동일한 설치된 배포와 관련이 있고 그에 따라 동일한 어트리뷰트를 가지더라도 현재는 같다고 비교되지 않습니다.- static at(path)¶
- classmethod from_name(name)¶
주어진 경로 또는 이름에 해당하는
Distribution인스턴스를 반환합니다.
- classmethod discover(*, context=None, **kwargs)¶
모든 패키지에 대한
Distribution인스턴스의 반복 가능 객체를 반환합니다(distribution-discovery 참고).선택적 인자 context 는 배포 검색을 수정하는 데 사용되는
DistributionFinder.Context인스턴스입니다. 또는 kwargs 에 새로운DistributionFinder.Context를 생성하기 위한 키워드 인수가 포함될 수 있습니다.
- metadata: PackageMetadata¶
배포에 METADATA 파일이 없는 경우
MetadataNotFound를 발생시킵니다.Distribution인스턴스는PackageMetadata인스턴스로서 다양한 종류의 추가 메타데이터를 제공합니다:>>> dist.metadata['Requires-Python'] '>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*' >>> dist.metadata['License'] 'MIT'
사용 가능한 메타데이터 전체 집합은 여기서 설명하지 않습니다. 자세한 내용은 PyPA의 Core metadata specification 를 참조하십시오.
- origin¶
편집 가능한 패키지의 경우,
origin프로퍼티가 PEP 610 메타데이터를 나타낼 수 있습니다(편집 불가능한 패키지의 경우,origin은None입니다):>>> dist.origin.url 'file:///path/to/wheel-0.32.3.editable-py3-none-any.whl'
origin객체는 Direct URL Data Structure 를 따릅니다.Added in version 3.13.
- entry_points: EntryPoints¶
이 배포 패키지가 제공하는 엔트리 포인트입니다.
implementing-custom-providers 구현 시 다음 두 가지 추상 메서드를 구현해야 합니다:
- locate_file(path)¶
PackagePath.locate()와 같이, 주어진 경로에 대한SimplePath를 반환합니다.os.PathLike또는str을 인자로 받습니다.
- read_text(filename)¶
distribution.locate_file(filename).read_text()의 단축 기능입니다.
배포 발견¶
기본적으로 이 패키지는 파일 시스템 및 zip 파일 배포 패키지 의 메타데이터를 검색하는 기본 기능을 제공합니다. 이 메타데이터 파인더는 기본적으로 sys.path 를 사용하지만, 다른 임포트 매커니즘이 해당 값을 해석하는 방식과는 약간 다르게 해석됩니다. 특히:
importlib.metadata는sys.path에 있는bytes객체를 인식하지 않습니다.importlib.metadata는sys.path에 있는pathlib.Path객체를 우연히 인식하지만, 이러한 값들은 임포트 시에는 무시됩니다.
- class importlib.metadata.DistributionFinder¶
설치된 배포를 검색할 수 있는
MetaPathFinder의 서브클래스입니다.사용자 정의 제공자는 메타데이터를 공급하기 위해 이 인터페이스를 구현해야 합니다.
- class Context(**kwargs)¶
Context는 사용자 정의 제공자가 배포를 검색할 때distributions()또는Distribution.discover()와 같은 배포 탐색 함수의 호출자로부터.name및.path외에 추가적인 세부 정보를 요청할 수 있는 수단을 제공합니다.예를 들어, 제공자가 패키지 세트를 “public” 또는 “private”
realm으로 노출할 수 있습니다. 배포 탐색 함수의 호출자는 특정 realm에 속한 배포만 조회하기를 원할 수 있으며, 이 경우distributions(realm="private")을 호출하여 사용자 정의 제공자에게 해당 realm의 배포만 포함하도록 알릴 수 있습니다.각
DistributionFinder는 모든 매개변수를 처리할 수 있어야 하며, 적절한 경우 아래에 정의된 표준 매개변수를 준수하도록 시도해야 합니다.자세한 내용은 사용자 정의 제공자 구현 섹션을 참조하십시오.
- name¶
배포 파인더가 일치시켜야 하는 특정 이름입니다.
.name이None인 경우 모든 배포와 일치합니다.
- importlib.metadata.distributions(**kwargs)¶
모든 패키지에 대한
Distribution인스턴스의 반복 가능 객체를 반환합니다.kwargs 인자는 키워드 인자
context또는DistributionFinder.Context인스턴스를 포함할 수 있으며, 새로운DistributionFinder.Context`를 생성하기 위한 키워드 인자를 전달할 수도 있습니다. :class:!DistributionFinder.Context`는 배포 검색을 수정하는 데 사용됩니다.
사용자 정의 제공자 구현¶
importlib.metadata 는 소비자(consumers) 를 위한 인터페이스와 제공자(providers) 를 위한 인터페이스라는 두 가지 API 영역을 다룹니다. 대부분의 사용자는 패키지가 제공하는 메타데이터를 사용하는 소비자입니다. 그러나 사용자 정의 임포터를 함께 사용하는 방식처럼 다른 매커니즘을 통해 메타데이터를 노출하고자 하는 경우도 있습니다. 이러한 사례에서는 사용자 지정 제공자(custom provider) 가 필요합니다.
배포 패키지 메타데이터는 sys.path 탐색이나 패키지 로더를 통해 직접 가져올 수 없으므로, 임포트 시스템의 파인더 를 통해 찾습니다. importlib.metadata 는 배포 패키지의 메타데이터를 찾기 위해 sys.meta_path 에 있는 메타 경로 파인더 목록을 조회합니다.
이 구현은 파일 시스템에서 발견된 배포 패키지의 메타데이터를 제공하기 위해 PathFinder 에 통합된 훅을 포함합니다.
추상 클래스 importlib.abc.MetaPathFinder 는 파이썬 임포트 시스템에서 파인더가 갖춰야 할 인터페이스를 정의합니다. importlib.metadata 는 sys.meta_path 의 파인더들로부터 선택적인 find_distributions 콜러블을 찾는 방식으로 이 프로토콜을 확장하며, 이 확장된 인터페이스를 다음과 같은 추상 메서드를 정의하는 DistributionFinder 추상 베이스 클래스로 제공합니다:
@abc.abstractmethod
def find_distributions(context=DistributionFinder.Context()) -> Iterable[Distribution]:
"""지정된 ``context``에 해당하는 패키지의 메타데이터를 불러올 수 있는 모든 Distribution 인스턴스의
반복 가능한 객체를 반환합니다.
"""
DistributionFinder.Context 객체는 탐색할 경로를 나타내는 path 와 일치시킬 이름을 나타내는 name 속성을 제공하며, 소비자가 필요로 하는 다른 관련 컨텍스트를 제공할 수도 있습니다.
실제로 파일 시스템 이외의 위치에서 배포 패키지 메타데이터를 찾는 기능을 지원하려면, Distribution`을 서브클래스화하고 추상 메서드들을 구현하십시오. 그런 다음 커스텀 파인더에서 ``find_distributions()` 메서드를 통해 파생된 이 Distribution 인스턴스를 반환하면 됩니다.
예제¶
데이터베이스에서 파이썬 모듈을 로드하는 커스텀 파인더를 가정해 보겠습니다:
class DatabaseImporter(importlib.abc.MetaPathFinder):
def __init__(self, db):
self.db = db
def find_spec(self, fullname, target=None) -> ModuleSpec:
return self.db.spec_from_name(fullname)
sys.meta_path.append(DatabaseImporter(connect_db(...)))
이 임포터는 이제 데이터베이스에서 가져올 수 있는 모듈을 제공할 것으로 예상되지만, 메타데이터나 엔트리 포인트를 제공하지는 않습니다. 이 커스텀 임포터가 메타데이터를 제공하게 하려면 DistributionFinder 도 구현해야 합니다:
from importlib.metadata import DistributionFinder
class DatabaseImporter(DistributionFinder):
...
def find_distributions(self, context=DistributionFinder.Context()):
query = dict(name=context.name) if context.name else {}
for dist_record in self.db.query_distributions(query):
yield DatabaseDistribution(dist_record)
이 방식을 통해 query_distributions 는 쿼리에 부합하는 데이터베이스 내의 각 배포 레코드를 반환하게 됩니다. 예를 들어, 데이터베이스에 requests-1.0 이 포함되어 있다면, find_distributions 는 Context(name='requests') 또는 Context(name=None) 에 대해 DatabaseDistribution 을 생성하여 반환합니다.
단순화를 위해 이 예제에서는 context.path 를 무시합니다. path 속성은 기본적으로 sys.path 이며, 탐색 시 고려될 임포트 경로 세트를 의미합니다. DatabaseImporter 는 탐색 경로에 상관없이 동작할 수도 있습니다. 임포터가 파티셔닝을 수행하지 않는다고 가정하면 “path”는 중요하지 않습니다. path 의 목적을 보여주려면 sys.path/PYTHONPATH 에 따라 행동이 달라지는 더 복잡한 DatabaseImporter 를 예로 들어야 합니다. 이 경우, find_distributions 는 context.path 를 준수하여 해당 경로와 관련된 Distribution 만 반환해야 합니다.
따라서 DatabaseDistribution 은 다음과 유사한 형태가 됩니다:
class DatabaseDistribution(importlib.metadata.Distribution):
def __init__(self, record):
self.record = record
def read_text(self, filename):
"""
Read a file like "METADATA" for the current distribution.
"""
if filename == "METADATA":
return f"""Name: {self.record.name}
Version: {self.record.version}
"""
if filename == "entry_points.txt":
return "\n".join(
f"""[{ep.group}]\n{ep.name}={ep.value}"""
for ep in self.record.entry_points)
def locate_file(self, path):
raise RuntimeError("This distribution has no file system")
이 기본적인 구현은 record 가 적절한 .name, .version 및 .entry_points 속성을 제공한다고 가정할 때, DatabaseImporter 에 의해 제공되는 패키지에 대한 메타데이터와 엔트리 포인트를 제공합니다.
DatabaseDistribution 은 또한 RECORD (Distribution.files 에 필요)와 같은 다른 메타데이터 파일을 제공하거나 Distribution.files 의 구현을 재정의할 수 있습니다. 더 자세한 아이디어는 소스 코드를 참조하십시오.