Допустим, вам нужно выбрать конкретное действие в зависимости от версии используемого интерпретатора.
В моём примере мне нужна версия Python больше чем 3.5.
Самый очевидный способ проверки мажорной версии такой:
>>> import sysС минорной версией будет чуть длинней
>>> print sys.version_info.major > 3
True
>>> print sys.version_info.major == 3 and sys.version_info.minor > 5Можно ли сократить эту запись?
Конечно! Иначе поста бы не было 😊
Вспоминаем как работает сравнение итерируемых объектов в Python. Элементы сравниваются попарно. Если первая пара совпала, проверяется следующая пара, и так пока не найдутся разные элементы или закончится один из итераторов. Например, сравним кортежи.
>>> (1, 2) > (1, 3)Теперь преобразуем version_info в кортеж (или список)
False
>>> (1, 4, 5) > (1, 4, 3)
True
>>> tuple(sys.version_info)И можем использовать его для сравнения кортежей
(3, 7, 3, 'final', 0)
>>> tuple(sys.version_info) > (3, 5)На самом деле можно и не преобразовывать явно, главное запомнить что сравнивать нужно с кортежем.
True
>>> sys.version_info > (3, 5)Можно еще как-то иначе? Можно!
True
Строки тоже итерируемый объект. Они сравниваются не по длине или кодам символов, а так же попарно, и по порядку символа в таблице (или в алфавите).
>>> 'a' > 'b'А что у нас есть еще в sys? Правильно, переменная version.
False
>>> 'e' > 'c'
True
>>> '5' < '4'
False
>>> print (sys.version)Сравниваем эту переменную с другой строкой:
'3.7.3 (default, Dec 20 2019, 18:57:59) \n[GCC 8.3.0]'
>>> sys.version > '3.5'⚠️ Этот метод со строкой перестанет работать когда версия Python станет 3.10+. Не используйте его!
True
# tricks