Python, jedno źródło wersji pakietu

Ten post został napisany ponad 2 lata temu, do wszystkich porad technologicznych w nim zawartych lepiej będzie podejść z dużą rezerwą, bo bardzo możliwe że tego rodzaju informacje są już nieaktualne.

Opublikowano: 29.12.2019

Ostatnia modyfikacja: 07.02.2024

python

Jest kilka sposobów, żeby w skrypcie instalacyjnym pakietu pobrać wersję w sposób bezpieczny. Niepełną listę takich możliwości można znaleźć np. w jednym z dokumentów PyPA (proszę zauważyć, że ostatnia propozycja nie jest taka całkiem bezpieczna, o czym jest wspomniane w notce). Ale oczywiście to nie koniec.

Chrum, chrum

Kilka miesięcy temu wpadłem na pomysł, by do uzyskania tej wartości użyć AST, ale nie miałem jakoś specjalnie czasu, by do tego usiąść i to ogarnąć. I proszę, znalazłem przykład wykorzystania AST do tego w kodzie pakietu pydal, choć nie w taki sposób jak zamierzałem.

_version_re = re.compile(r"__version__\s+=\s+(.*)")

with open("pydal/__init__.py", "rb") as f:
    version = str(
        ast.literal_eval(_version_re.search(f.read().decode("utf-8")).group(1))
    )

Jest to trochę bezpieczniejszy sposób nr 3 z podanego wcześniej dokumentu PyPA (nie wykonuje się exec()) i ma on tę wyższość, że produkuje zwykły obiekt str, a nie słownik.