Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python Enhancement Proposals

PEP 459 – Standard-Metadatenerweiterungen für Python-Softwarepakete

Autor:
Alyssa Coghlan <ncoghlan at gmail.com>
BDFL-Delegate:
Alyssa Coghlan <ncoghlan at gmail.com>
Discussions-To:
Distutils-SIG Liste
Status:
Zurückgezogen
Typ:
Standards Track
Thema:
Packaging
Benötigt:
426
Erstellt:
11-Nov-2013
Post-History:
21-Dez-2013

Inhaltsverzeichnis

Rücknahme eines PEP

Diese PEP basiert auf PEP 426, die selbst zurückgezogen wurde. Details finden Sie im Abschnitt "PEP Withdrawal" dieser PEP.

Bis dahin werden Metadatenerweiterungen weiterhin so behandelt, wie es bei früheren Beispielen wie entry_points.txt der Fall war: als zusätzliche Dateien, die neben der Hauptdatei METADATA in Metadatenverzeichnissen installiert werden.

Zusammenfassung

Diese PEP beschreibt mehrere Standarderweiterungen für die Python-Metadaten.

Wie alle Metadatenerweiterungen ist jedes Standarderweiterungsformat unabhängig versioniert. Änderungen an einem der Formate erfordern ein Update dieser PEP, aber kein Update der Kern-Packaging-Metadaten.

Standard-Erweiterungs-Namespace

Das python-Projekt im Python Package Index bezieht sich auf den CPython-Referenzinterpreter. Dieser Namespace wird als Namespace für die Standard-Metadatenerweiterungen verwendet.

Die derzeit definierten Standarderweiterungen sind

  • python.details
  • python.project
  • python.integrator
  • python.exports
  • python.commands
  • python.constraints

Alle Standarderweiterungen sind derzeit auf Version 1.0, und daher kann das Feld extension_metadata weggelassen werden, ohne den Zugriff auf Funktionen zu verlieren.

Die python.details-Erweiterung

Die python.details-Erweiterung ermöglicht die Bereitstellung weiterer Informationen zur Softwareverteilung.

Die python.details-Erweiterung enthält vier benutzerdefinierte Unterfelder

  • license: die Urheberrechtslizenz für die Distribution
  • keywords: Paketindex-Schlüsselwörter für die Distribution
  • classifiers: Trove-Klassifizierer des Paketindex für die Distribution
  • document_names: die Namen zusätzlicher Metadatendateien

Alle diese Felder sind optional. Automatisierte Werkzeuge MÜSSEN korrekt funktionieren, wenn eine Distribution sie nicht bereitstellt, einschließlich eines sauberen Fehlers, wenn eine auf einem dieser Felder basierende Operation angefordert wird.

Lizenz

Eine kurze Zeichenkette, die die für diese Distribution verwendete Lizenz zusammenfasst.

Beachten Sie, dass Distributionen, die dieses Feld bereitstellen, weiterhin alle zutreffenden Lizenz-Trove-Klassifizierer im Feld Klassifizierer angeben sollten. Auch wenn ein geeigneter Trove-Klassifizierer verfügbar ist, kann die Lizenzzusammenfassung eine gute Möglichkeit sein, eine bestimmte Version dieser Lizenz anzugeben oder Variationen oder Ausnahmen von der Lizenz zu kennzeichnen.

Dieses Feld SOLLTE weniger als 512 Zeichen und MUSS weniger als 2048 Zeichen enthalten.

Dieses Feld SOLLTE keine Zeilenumbrüche enthalten.

Der vollständige Lizenztext SOLLTE als separate Datei im Quellarchiv der Distribution enthalten sein. Details finden Sie unter Dokumentennamen.

Beispiel

"license": "GPL version 3, excluding DRM provisions"

Schlüsselwörter

Eine Liste zusätzlicher Schlüsselwörter, die zur Unterstützung der Suche nach der Distribution in einem größeren Katalog verwendet werden.

Beispiel

"keywords": ["comfy", "chair", "cushions", "too silly", "monty python"]

Klassifizierer

Eine Liste von Zeichenketten, wobei jede einen einzelnen Klassifizierungswert für die Distribution angibt. Klassifizierer werden in PEP 301 [2] beschrieben.

Beispiel

"classifiers": [
  "Development Status :: 4 - Beta",
  "Environment :: Console (Text Based)",
  "License :: OSI Approved :: GNU General Public License v3 (GPLv3)"
]

Dokumentennamen

Dateinamen für unterstützende Dokumente, die im Metadatenverzeichnis dist-info der Distribution enthalten sind.

Die folgenden unterstützenden Dokumente können benannt werden

  • description: eine Datei, die eine lange Beschreibung der Distribution enthält
  • license: eine Datei mit dem vollständigen Text der Lizenz der Distribution
  • changelog: eine Datei, die Änderungen an der Distribution beschreibt

Unterstützende Dokumente MÜSSEN direkt im Verzeichnis dist-info enthalten sein. Verzeichnistrennzeichen sind in Dokumentennamen NICHT gestattet.

Das Markup-Format (falls vorhanden) der Datei wird durch die Dateierweiterung angegeben. Dies ermöglicht es Indexservern und anderen automatisierten Tools, enthaltene Textdokumente korrekt darzustellen und Feedback zu Rendering-Fehlern zu geben, anstatt das beabsichtigte Format erraten zu müssen.

Wenn die Dateierweiterung fehlt oder die Erweiterung nicht erkannt wird, MUSS das Standard-Rendering-Format reiner Text sein.

Die folgenden Markup-Renderer SOLLTEN für die angegebenen Dateierweiterungen verwendet werden

  • Reiner Text: .txt, keine Erweiterung, unbekannte Erweiterung
  • reStructured Text: .rst
  • Markdown: .md
  • AsciiDoc: .adoc, .asc, .asciidoc
  • HTML: .html, .htm

Automatisierte Tools KÖNNEN eines oder mehrere der angegebenen Formate als reinen Text rendern und KÖNNEN andere Markup-Formate über die aufgeführten hinaus rendern.

Automatisierte Tools SOLLTEN keine Annahmen hinsichtlich der maximalen Länge von unterstützenden Dokumentinhalten treffen, außer soweit es zum Schutz der Integrität eines Dienstes erforderlich ist.

Beispiel

"document_names": {
    "description": "README.rst",
    "license": "LICENSE.rst",
    "changelog": "NEWS"
}

Die python.project-Erweiterung

Die python.project-Erweiterung ermöglicht die Bereitstellung weiterer Informationen zur Erstellung und Wartung der Distribution.

Die python.project-Erweiterung enthält drei benutzerdefinierte Unterfelder

  • contacts: wichtige Kontaktpunkte für die Distribution
  • contributors: weitere Mitwirkende an der Distribution
  • project_urls: relevante URLs für die Distribution

Kontaktinformationen

Details zu Einzelpersonen und Organisationen werden als Mappings mit den folgenden Unterfeldern aufgezeichnet

  • name: der Name einer Einzelperson oder Gruppe
  • email: eine E-Mail-Adresse (dies kann eine Mailingliste sein)
  • url: eine URL (z. B. eine Profilseite auf einem Quellcode-Hosting-Dienst)
  • role: einer von "author", "maintainer" oder "contributor"

Das Unterfeld name ist erforderlich, die anderen Unterfelder sind optional.

Wenn keine spezifische Rolle angegeben ist, ist der Standard contributor.

E-Mail-Adressen müssen im Format local-part@domain vorliegen, wobei der lokale Teil bis zu 64 Zeichen lang sein darf und die gesamte E-Mail-Adresse nicht mehr als 254 Zeichen enthält. Die formale Spezifikation des Formats ist in RFC 5322 (Abschnitte 3.2.3 und 3.4.1) und RFC 5321 enthalten, mit einer lesbareren Form in der informativen RFC 3696 und den zugehörigen Errata.

Die definierten Mitwirkenden-Rollen sind wie folgt

  • author: der ursprüngliche Ersteller einer Distribution
  • maintainer: der aktuelle Hauptmitwirkende für eine Distribution, wenn er nicht der ursprüngliche Ersteller ist
  • contributor: alle anderen Einzelpersonen oder Organisationen, die an der Erstellung der Distribution beteiligt waren

Kontakt- und Mitwirkenden-Metadaten sind optional. Automatisierte Werkzeuge MÜSSEN korrekt funktionieren, wenn eine Distribution sie nicht bereitstellt, einschließlich eines sauberen Fehlers, wenn eine auf einem dieser Felder basierende Operation angefordert wird.

Kontakte

Eine Liste von Mitwirkenden-Einträgen, die die empfohlenen Kontaktpunkte für weitere Informationen über das Projekt angeben.

Das folgende Beispiel wäre für ein Projekt geeignet, das gerade vom ursprünglichen Autor an einen neuen Hauptwart übergeben wird und als Teil einer größeren Entwicklungsgruppe fungiert.

Beispiel

"contacts": [
  {
    "name": "Python Packaging Authority/Distutils-SIG",
    "email": "distutils-sig@python.org",
    "url": "https://bitbucket.org/pypa/"
  },
  {
    "name": "Samantha C.",
    "role": "maintainer",
    "email": "dontblameme@example.org"
  },
  {
    "name": "Charlotte C.",
    "role": "author",
    "email": "iambecomingasketchcomedian@example.com"
  }
]

Mitwirkende

Eine Liste von Mitwirkenden-Einträgen für andere Mitwirkende, die nicht bereits als aktuelle Projektkontaktpunkte aufgeführt sind. Die Unterfelder innerhalb der Listenelemente sind dieselben wie die für das Hauptkontaktfeld.

Beispiel

"contributors": [
  {"name": "John C."},
  {"name": "Erik I."},
  {"name": "Terry G."},
  {"name": "Mike P."},
  {"name": "Graeme C."},
  {"name": "Terry J."}
]

Projekt-URLs

Ein Mapping von beliebigen Textlabels zu zusätzlichen URLs, die für das Projekt relevant sind.

Während Projekte frei sind, ihre eigenen Labels und spezifischen URLs zu wählen, wird EMPFOHLEN, Links zur Homepage, zur Quellcodeverwaltung, zum Issue Tracker und zur Dokumentation mit den im folgenden Beispiel genannten Labels bereitzustellen.

URL-Labels MÜSSEN von automatisierten Tools als nicht case-sensitiv behandelt werden, sie müssen aber keine gültigen Python-Bezeichner sein. Jede legale JSON-Zeichenkette ist als URL-Label zulässig.

Beispiel

"project_urls": {
  "Documentation": "https://distlib.readthedocs.org",
  "Home": "https://bitbucket.org/pypa/distlib",
  "Repository": "https://bitbucket.org/pypa/distlib/src",
  "Tracker": "https://bitbucket.org/pypa/distlib/issues"
}

Die python.integrator-Erweiterung

Strukturell ist diese Erweiterung weitgehend identisch mit der python.project-Erweiterung (der Erweiterungsname ist der einzige Unterschied).

Während sich die Metadaten von project auf die Upstream-Ersteller der Software beziehen, beziehen sich die Metadaten von integrator auf den Downstream-Weiterverteiler einer modifizierten Version.

Wenn die Software unverändert weiterverteilt wird, wird diese Erweiterung typischerweise nicht verwendet. Wenn die Software jedoch gepatcht wurde (z. B. durch Zurückportierung kompatibler Korrekturen aus einer späteren Version oder durch Behebung eines plattformspezifischen Kompatibilitätsproblems), SOLLTE diese Erweiterung verwendet werden und ein lokales Versionslabel zur Versionskennung der Distribution hinzugefügt werden.

Wenn es mehrere Weiterverteiler in der Kette gibt, überschreibt jeder diese Erweiterung mit seinen spezifischen Metadaten.

Die python.exports-Erweiterung

Die meisten Python-Distributionen stellen Pakete und Module für den Import über den Python-Modul-Namespace bereit. Distributionen können beim Installieren auch andere Schnittstellen bereitstellen.

Die python.exports-Erweiterung enthält drei benutzerdefinierte Unterfelder

  • modules: Module, die von der Distribution exportiert werden
  • namespaces: Namespace-Pakete, zu denen die Distribution beiträgt
  • exports: andere Python-Schnittstellen, die von der Distribution exportiert werden

Export-Spezifizierer

Ein Export-Spezifizierer ist eine Zeichenkette, die aus einem vollqualifizierten Namen sowie einem optionalen zusätzlichen Namen in eckigen Klammern besteht. Dies ergibt die folgenden vier möglichen Formen für einen Export-Spezifizierer

module
module:name
module[requires_extra]
module:name[requires_extra]

Hinweis

Die jsonschema-Datei beschränkt derzeit qualifizierte Namen nach den Regeln für Python 2-ASCII-Bezeichner. Dies muss möglicherweise überdacht werden, angesichts der lockereren Regeln für Bezeichner in Python 3.

Die Bedeutung der Unterfelder ist wie folgt

  • module: das Modul, das den Export bereitstellt
  • name: falls zutreffend, der qualifizierte Name des Exports innerhalb des Moduls
  • requires_extra: gibt an, dass der Export nur korrekt funktioniert, wenn die zusätzlichen Abhängigkeiten, die im angegebenen Extra genannt sind, in der installierten Umgebung verfügbar sind

Hinweis

Ich habe dies als Mapping mit Unterfeldern versucht, und das machte die unten stehenden Beispiele unleserlich. Obwohl diese PEP hauptsächlich für die Werkzeugnutzung gedacht ist, ist Lesbarkeit auch für Debugging-Zwecke bis zu einem gewissen Grad wichtig, und da ich erwarte, dass Snippets des Formats anderswo wiederverwendet werden.

Module

Eine Liste von qualifizierten Namen von Modulen und Paketen, die die Distribution zum Import bereitstellt.

Hinweis

Die jsonschema-Datei beschränkt derzeit qualifizierte Namen nach den Regeln für Python 2-ASCII-Bezeichner. Dies muss möglicherweise überdacht werden, angesichts der lockereren Regeln für Bezeichner in Python 3.

Bei Namen, die Punkte enthalten, MUSS der Teil des Namens vor dem letzten Punkt entweder in der Liste der installierten Module oder in der Liste der Namespace-Pakete enthalten sein.

Um Namenskonflikte zu vermeiden, wird EMPFOHLEN, dass Distributionen ein einzelnes Top-Level-Modul oder -Paket bereitstellen, das dem Distributionsnamen (oder einer Kleinbuchstaben-Entsprechung) entspricht. Dies erfordert, dass der Distributionsname auch die Anforderungen eines Python-Bezeichners erfüllt, die strenger sind als die für Distributionsnamen). Diese Praxis erleichtert auch das Auffinden autoritativer Quellen für Module.

Indexserver SOLLTEN es mehreren Distributionen erlauben, dieselben Module zu veröffentlichen, KÖNNEN aber die Autoren der Distributionen über potenzielle Konflikte informieren.

Installationstools SOLLTEN einen Fehler melden, wenn sie aufgefordert werden, eine Distribution zu installieren, die ein Modul bereitstellt, das auch von einer anderen, bereits installierten, Distribution bereitgestellt wird.

Beachten Sie, dass der Versuch, einige deklarierte Module zu importieren, zu einer Ausnahme führen kann, wenn die entsprechenden Extras nicht installiert sind.

Beispiel

"modules": ["chair", "chair.cushions", "python_sketches.nobody_expects"]

Hinweis

Wenn dies stattdessen eine Liste von Export-Spezifizierern wäre, könnte eine Distribution deklarieren, wann ein bestimmtes Modul ein bestimmtes Extra zum korrekten Ausführen benötigt. Andererseits lässt sich argumentieren, dass es dann sinnvoll ist, eine separate Distribution zu erstellen, anstatt Extras zu verwenden.

Namespaces

Eine Liste von qualifizierten Namen von Namespace-Paketen, zu denen die Distribution Module beiträgt.

Hinweis

Die jsonschema-Datei beschränkt derzeit qualifizierte Namen nach den Regeln für Python 2-ASCII-Bezeichner. Dies muss möglicherweise überdacht werden, angesichts der lockereren Regeln für Bezeichner in Python 3.

Bei Python-Versionen vor Python 3.3 (das native Namespace-Paket-Unterstützung bietet) SOLLTEN Installationstools eine geeignete __init__.py-Datei ausgeben, um den Namespace ordnungsgemäß zu initialisieren, anstatt eine von der Distribution bereitgestellte Datei zu verwenden.

Installationstools SOLLTEN eine Warnung ausgeben und KÖNNEN einen Fehler ausgeben, wenn eine Distribution ein Namespace-Paket deklariert, das mit dem Namen eines bereits installierten Moduls kollidiert oder umgekehrt.

Beispiel

"namespaces": ["python_sketches"]

Exporte

Das Feld exports ist ein Mapping, das vorangestellte Namen als Schlüssel enthält. Jeder Schlüssel identifiziert eine Exportgruppe, die einen oder mehrere von der Distribution veröffentlichte Exporte enthält.

Exportgruppen-Namen werden von Distributionen definiert, die dann die veröffentlichten Exportinformationen auf irgendeine Weise nutzen werden. Der primäre Anwendungsfall sind Distributionen, die ein Plugin-Modell unterstützen: die Definition einer Exportgruppe ermöglicht es anderen Distributionen, anzugeben, welche Plugins sie bereitstellen, wie sie importiert und darauf zugegriffen werden können und welche zusätzlichen Abhängigkeiten (falls vorhanden) für das korrekte Funktionieren des Plugins erforderlich sind.

Um die Wahrscheinlichkeit von Namenskonflikten zu verringern, SOLLTEN Exportgruppen-Namen ein Präfix verwenden, das einem Modulnamen in der Distribution entspricht, der die Bedeutung der Exportgruppe definiert. Diese Praxis erleichtert auch das Auffinden autoritativer Dokumentation für Exportgruppen.

Jeder einzelne Export ist dann ein Mapping von beliebigen nicht-leeren Zeichenketten-Schlüsseln zu Export-Spezifizierern. Die Bedeutung der Exportnamen innerhalb einer Exportgruppe liegt beim der Exportgruppe definierenden Distribution. Die Erstellung einer geeigneten Definition für das Exportnamenformat kann es der importierenden Distribution ermöglichen, festzustellen, ob ein Export relevant ist oder nicht, ohne jedes exportierende Modul importieren zu müssen.

Beispiel

"exports": {
  "nose.plugins.0.10": {
    "chairtest": "chair:NosePlugin"
  }
}

Die python.commands-Erweiterung

Die python.commands-Erweiterung enthält drei benutzerdefinierte Unterfelder

  • wrap_console: Konsolen-Wrapper-Skripte, die vom Installer generiert werden sollen
  • wrap_gui: GUI-Wrapper-Skripte, die vom Installer generiert werden sollen
  • prebuilt: Skripte, die vom Build-Prozess der Distribution erstellt und direkt im konfigurierten Skriptverzeichnis installiert werden

wrap_console und wrap_gui sind beides Mappings von Skriptnamen zu Export-Spezifizierern. Die Skriptnamen müssen denselben Namensregeln wie Distributionsnamen folgen.

Die Export-Spezifizierer für Wrapper-Skripte müssen sich entweder auf ein Paket mit einem __main__-Untermodul beziehen (wenn kein Unterfeld name im Export-Spezifizierer angegeben ist) oder auf einen Aufrufbaren innerhalb des benannten Moduls.

Installationstools sollten im Rahmen des Installationsprozesses geeignete Wrapper generieren.

Hinweis

Benötigt noch mehr Details dazu, was "geeignete Wrapper" bedeutet. Bis auf Weiteres verweisen Sie auf die Wrapper-Skripte, die von setuptools und zc.buildout generiert werden.

prebuilt ist eine Liste von Skriptpfaden, relativ zum Skriptverzeichnis in einer Wheel-Datei oder nach der Installation. Sie dienen nur zu Informationszwecken – ihre Installation wird über die normalen Prozesse für Dateien abgewickelt, die beim Erstellen einer Distribution erstellt werden.

Build-Tools SOLLTEN diese Erweiterung als erfordern, dass sie von Installern behandelt wird, kennzeichnen.

Indexserver SOLLTEN es mehreren Distributionen erlauben, dieselben Befehle zu veröffentlichen, KÖNNEN aber die Autoren der Distributionen über potenzielle Konflikte informieren.

Installationstools SOLLTEN einen Fehler melden, wenn sie aufgefordert werden, eine Distribution zu installieren, die einen Befehl bereitstellt, der auch von einer anderen, bereits installierten, Distribution bereitgestellt wird.

Beispiel

"python.commands": {
  "installer_must_handle": true,
  "wrap_console": [{"chair": "chair:run_cli"}],
  "wrap_gui": [{"chair-gui": "chair:run_gui"}],
  "prebuilt": ["reduniforms"]
}

Die python.constraints-Erweiterung

Die python.constraints-Erweiterung enthält zwei benutzerdefinierte Unterfelder

  • environments: unterstützte Installationsumgebungen
  • extension_metadata: erforderliche exakte Übereinstimmungen in Metadatenfeldern von Erweiterungen, die von anderen installierten Komponenten veröffentlicht werden

Build-Tools SOLLTEN diese Erweiterung als erfordern, dass sie von Installern behandelt wird, kennzeichnen.

Indexserver SOLLTEN es Distributionen erlauben, mit Constraints hochgeladen zu werden, die mit diesem Index nicht erfüllt werden können, KÖNNEN aber die Autoren der Distributionen über solche potenziellen Kompatibilitätsprobleme informieren.

Installationstools SOLLTEN einen Fehler melden, wenn Constraints von der Distribution angegeben werden und die Zielinstallationsumgebung diese nicht erfüllt, MÜSSEN aber zumindest eine Warnung ausgeben und KÖNNEN dem Benutzer erlauben, die Installation trotzdem zu erzwingen.

Beispiel

"python.constraints": {
  "installer_must_handle": true,
  "environments": ["python_version >= 2.6"],
  "extension_metadata": {
    "fortranlib": {
      "fortranlib.compatibility": {
        "fortran_abi": "openblas-g77"
      }
    }
  }
}

Unterstützte Umgebungen

Das Unterfeld environments ist eine Liste von Zeichenketten, die die Umgebungen angeben, die die Distribution explizit unterstützt. Eine Umgebung gilt als unterstützt, wenn sie mit mindestens einem der angegebenen Umgebungsmarker übereinstimmt.

Wenn dieses Feld nicht in den Metadaten angegeben ist, wird angenommen, dass die Distribution jede von Python unterstützte Plattform unterstützt.

Einzelne Einträge sind Umgebungsmarker, wie in PEP 426 beschrieben.

Die beiden Hauptanwendungen dieses Feldes sind die Deklaration, welche Python-Versionen und welche zugrundeliegenden Betriebssysteme unterstützt werden.

Beispiele für unterstützte Python-Versionen

# Supports Python 2.6+
"environments": ["python_version >= '2.6'"]

# Supports Python 2.6+ (for 2.x) or 3.3+ (for 3.x)
"environments": ["python_version >= '3.3'",
                 "'3.0' > python_version >= '2.6'"]

Beispiele für unterstützte Betriebssysteme

# Windows only
"environments": ["sys_platform == 'win32'"]

# Anything except Windows
"environments": ["sys_platform != 'win32'"]

# Linux or BSD only
"environments": ["'linux' in sys_platform",
                 "'bsd' in sys_platform"]

Beispiel, bei dem die unterstützte Python-Version je nach Plattform variiert

# The standard library's os module has long supported atomic renaming
# on POSIX systems, but only gained atomic renaming on Windows in Python
# 3.3. A distribution that needs atomic renaming support for reliable
# operation might declare the following supported environments.
"environment": ["python_version >= '2.6' and sys_platform != 'win32'",
                "python_version >= '3.3' and sys_platform == 'win32'"]

Metadatenerweiterungs-Constraints

Das Unterfeld extension_metadata ist ein Mapping von Distributionsnamen zu Metadatenschnipseln von Erweiterungen, die exakt mit den Metadaten der benannten Distribution in der Zielinstallationsumgebung übereinstimmen müssen.

Jedes Unter-Mapping besteht dann aus einem Mapping von Metadatenerweiterungsnamen zu den exakten erwarteten Werten einer Teilmenge von Feldern.

Zum Beispiel kann eine Distribution namens fortranlib je nach Build-Art eine andere FORTRAN ABI veröffentlichen, und alle verwandten Projekte, die in dieselbe Laufzeitumgebung installiert werden, sollten übereinstimmende Build-Optionen verwenden. Dies kann dadurch erreicht werden, dass die Basisdistribution eine benutzerdefinierte Erweiterung veröffentlicht, die die für die Erstellung der Binärerweiterungen verwendete Build-Option angibt

"extensions": {
  "fortranlib.compatibility": {
    "fortran_abi": "openblas-g77"
  }
}

Andere Distributionen, die Binärerweiterungen enthalten, die mit der Basisdistribution kompatibel sein müssen, würden dann eine entsprechende Einschränkung in ihren eigenen Metadaten definieren

"python.constraints": {
  "installer_must_handle": true,
  "extension_metadata": {
    "fortranlib": {
      "fortranlib.compatibility": {
        "fortran_abi": "openblas-g77"
      }
    }
  }
}

Diese Einschränkung gibt an, dass

  • fortranlib installiert sein muss (dies sollte auch als normale Abhängigkeit ausgedrückt werden, damit Installer sicherstellen, dass sie erfüllt ist)
  • Die installierte Version von fortranlib muss die benutzerdefinierte Erweiterung fortranlib.compatibility in ihren veröffentlichten Metadaten enthalten
  • Das Unterfeld fortan_abi dieser Erweiterung muss den *exakten* Wert openblas-g77 haben.

Wenn all diese Bedingungen erfüllt sind (die Distribution ist installiert, die angegebene Erweiterung ist in den Metadaten enthalten, die angegebenen Unterfelder haben den exakten angegebenen Wert), dann gilt die Einschränkung als erfüllt.

Hinweis

Der primäre beabsichtigte Anwendungsfall hier ist die Ermöglichung von C-Erweiterungen mit zusätzlichen ABI-Kompatibilitätsanforderungen, diese so zu deklarieren, dass jedes Installationstool sie durchsetzen kann, ohne die Details verstehen zu müssen. Insbesondere müssen viele NumPy-basierte wissenschaftliche Bibliotheken mit einem konsistenten Satz von FORTRAN-Bibliotheken erstellt werden, daher das "fortranlib"-Beispiel.

Aus diesem Grund gibt es keine Unterstützung für Mustervergleich oder boolesche Logik: Selbst die "einfache" Version dieser Erweiterung ist relativ komplex, und es gibt derzeit keine zwingende Begründung, sie komplizierter zu machen, als sie bereits ist.


Quelle: https://github.com/python/peps/blob/main/peps/pep-0459.rst

Zuletzt geändert: 2025-02-01 08:59:27 GMT