[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