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:
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.