[python] Je k dispozici novější verze?
Petr Viktorin
encukou na gmail.com
Úterý Prosinec 4 10:10:19 CET 2018
On 12/4/18 8:11 AM, Petr Blahoš wrote:
[...]
> Já jsem to na začátku neřekl jasně, Chtěl jsem pouze použít ty funkce
> pipu, které umí vyextrahovat verzi z názvy souboru,
> a verze porovnat. Protože to číslování verzí, když uvážíme veškeré bety
> a rc a různé formáty je zatraceně složitý, takže
> by bylo lepší použít už existující funkce spíš než to psát, a to i
> přesto, že ty balíčky, o kterých mluvíme jsou moje, takže
> to jejich schéma verzování znám, a můžu to postavit přímo na ně.
Ahoj!
pip není knihovna, nemá veřejné funkce. Jeho vnitřnosti se mění dost
často na to, aby se nevyplatilo ho importovat. Určité části pipu se
postupně reimplementují ve znovupoužitelných knihovnách, ale parsování
jmen wheel souborů v tomhle myslím není moc priorita. Naštěstí je
relativně jednoduché.
Jména wheelů jsou standardizována v [PEP 427]. Části jména souboru jsou
oddělené pomlčkama, a verze je druhá část. (Specifikace dál říká, že ty
části jsou navíc pozměněné aby obsahovaly jen písmena/čísla/tečku. Ale
validní verze nemůže obsahovat jiné znaky, takže ji lze z jména wheelu
korektně získat.)
Verze a jejich porovnání jsou standardizovány v [PEP 440], ale tam je to
trochu složitější než `name.split('-')[1]`. Naštěstí na porovnávání
verzí existuje oficiální knihovna [packaging]. Chceš třídu
`packaging.version.Version`.
----
Implementace v pipu je ještě složitější, protože pip se umí postarat i o
starší způsoby verzování, které už by jako wheel nemělo být možné vydat.
(Ani se nedají rozumně zakódovat do jména wheelu.) Tyhle způsoby nebyly
standardizované; "správně" je porovnat byl ideál kterému se dá
přibližovat, ale nedá se ho dosáhnout.
Pro úplnost: na verze pip aktuálně používá [heuristiku] která se snaží
být kompatibilní s [distutils.version], jehož [nedokumentované] třídy
LooseVersion a StrictVersion jsou sbírka černé magie (s odpovídajícím
komentářem!), resp. nepovedený pokus to nějak vyřešit.
Asi si dokážeš představit, že udržovat kód který takové věci dělá není
jednoduché. To je asi hlavní důvod proč samotný pip nemá API a je
tendence standardizované/korektní části dávat z pipu ven do knihoven
jako `packaging`.
[PEP 427]: https://www.python.org/dev/peps/pep-0427/#file-name-convention
[PEP 503]: https://www.python.org/dev/peps/pep-0503/#normalized-names
[packaging]: https://packaging.pypa.io/en/latest/version/
[heuristiku]:
https://github.com/pypa/pip/blob/873662179aebbf5eacdf681078f47bbfe5ee6149/src/pip/_vendor/distlib/version.py
[distutils.version]:
https://github.com/python/cpython/blob/master/Lib/distutils/version.py
[nedokumentované]:
https://docs.python.org/3/distutils/apiref.html#module-distutils.version
Další informace o konferenci Python