169 words
1 minute
Programmatically comparing Python version strings
Anubhav Gain
2024-06-21

Programmatically comparing Python version strings#

I found myself wanting to compare the version numbers 0.63.1, 1.0 and the 1.0a13 in Python code, in order to mark a pytest test as skipped if the installed version of Datasette was pre-1.0.

This is very slightly tricky, because 1.0 is a higher version than 1.0a13 but comparing it based on string comparison or a tuple of components split by . would give the wrong result.

It turns out the packaging.version Python package solves this exact problem:

Terminal window
python -m pip install packaging

Then:

from packaging.version import parse
v_1_0 = parse("1.0")
v_1_0a13 = parse("1.0a13")
v_0631 = parse("0.63.1")

And some comparisons:

>>> v_1_0 > v_1_0a13
True
>>> v_1_0 < v_1_0a13
False
>>> v_0631 < v_1_0
True
>>> v_0631 < v_1_0a13
True

Using this with pytest#

Here’s how I used this to decorate a pytest test so it would only run on versions of Datasette more recent than 1.0a13:

from datasette import version
from packaging.version import parse
import pytest
@pytest.mark.asyncio
@pytest.mark.skipif(
parse(version.__version__) < parse("1.0a13"),
reason="uses row_actions() plugin hook",
)
async def test_row_actions():
# ...

Full example test here.

Programmatically comparing Python version strings
https://mranv.pages.dev/posts/programmatically-comparing-python-version-strings/
Author
Anubhav Gain
Published at
2024-06-21
License
CC BY-NC-SA 4.0