importlib.metadata: Keys funktionieren nicht, wenn es mehrere gibt

Hi,
ich versuche herauszufinden, wie die Nutzung von importlib.metadata eigentlich gedacht ist. In Beispielen sieht man of einen dict-artigen Zugriff
importlib.metadata.metadata['mypackage']['Version']
Das funktioniert aber nicht, wenn man z.B. mehrere "Classifier" oder "Project-URL" in den Meta-Daten des Paketes hat.
importlib.metadata.metadata['mypackage']['Project-URL']
zeigt immer nur die erste URL an, aber nicht die weiteren.
Das Meta-Datenobjekt hat auch einen merkwürdigen Typ.
>>> m = metadata.metadata('mypackage') >>> m <email.message.Message object at 0x7fa2cabe6370>
Nun kann ich das alles umgehen, in dem ich auf das "_headers" Attribute zugreife und ein bisschen "rummauschle".
for h in m._headers:
... if h[0] == 'Project-URL': ... print(h[1]) ... homepage, https://codeberg.org/buhtz/hyperorg repository, https://codeberg.org/buhtz/hyperorg changelog, https://codeberg.org/buhtz/hyperorg/src/CHANGELOG.md
Da es sich aber um ein privates Attribute handelt, betrachte ich das als Workaround/Hack und nicht so von den Entwicklern gedacht.

Am 02.01.23 um 15:00 schrieb c.buhtz@posteo.jp:
Das funktioniert aber nicht, wenn man z.B. mehrere "Classifier" oder "Project-URL" in den Meta-Daten des Paketes hat.
importlib.metadata.metadata['mypackage']['Project-URL']
Muss das nicht sein
a) eine Funktionsaufruf: importlib.metadata.metadata('mypackage')
b) get_all('Project-Url')
denn die Doku [1] sagt:
Note: The actual type of the object returned by |metadata()| is an implementation detail and *should be accessed only through the interface described by the **PackageMetadata protocol https://importlib-metadata.readthedocs.io/en/latest/api.html#importlib_metadata.PackageMetadata**.*
[1] https://docs.python.org/3/library/importlib.metadata.html#distribution-metad... *

Hallo Hartmut,
danke für die Rückmeldung.
Am 02.01.2023 16:46 schrieb Hartmut Goebel:
b) get_all('Project-Url')
denn die Doku [1] sagt:
Die Doku ist da sehr kryptisch, wenn man den Hintergrund nicht versteht. Und obwohl ich jetzt weiß, durch dich, wie es geht, kapiere ich nicht warum.
Warum steht get_all() nicht in der Doku von "importlib.metadata" und stattdessen in einer externen Quelle?
In dieser Quelle ist von einem Objekt des Typs "importlib_metadata.PackageMetadata" die Rede. Ich bekomme aber ein "email.message.Message" Objekt geliefert. Das passt nicht zusammen, vom Verständnis her. ;)
SG Christian

Am 02.01.23 um 22:21 schrieb c.buhtz@posteo.jp:
Warum steht get_all() nicht in der Doku von "importlib.metadata" und stattdessen in einer externen Quelle?
Das weiß ich auch nicht. :-) Immerhin verweist die Doku von "importlib.metadata" auf die externe. Nützt halt leider wenig, wenn man pydoc nutzt.
participants (2)
-
c.buhtz@posteo.jp
-
Hartmut Goebel