Как получить выход из сценария, если он запускает более раннюю версию интерпретатора, чем требуется? - PullRequest
2 голосов
/ 18 июня 2020

Я хочу потребовать Python v3.6 + для моего сценария командной строки. У меня есть сценарий с именем quit_on_27.py, как показано ниже:

import sys

if sys.version_info < (3, 6):
    sys.exit("Please use Python 3.6+")


def hello(name:str):
    print(f'Hello, {name}!')


if __name__ == '__main__':
    hello('Jon')

Когда я запускаю его как сценарий, используя Python 2.7:

> python .\quit_on_27.py
  File ".\quit_on_27.py", line 7
    def hello(name:str):
                  ^
SyntaxError: invalid syntax

У меня также есть такой же SyntaxError когда я использую assert sys.version_info >= (3, 6), как указано в Как мне проверить, какая версия Python запускает мой скрипт? вместо условного выше.

Я бы хотел использовать ввод и f-строки и другие функции, недоступные в Python 2.7, и я хотел бы сообщить пользователям использовать более новую версию Python вместо того, чтобы просто видеть SyntaxError.

Как мне получить этот сценарий должен завершиться изящно и услужливо?

Это более конкретный c, чем Как я могу безопасно завершить сам сценарий python? , поскольку я спрашиваю, почему мое условие не работает t работает так, как я предполагал, на основе версии Python, в которой запущен скрипт.

Примечание: мой скрипт работает так, как задумано в Python 3.6.

1 Ответ

1 голос
/ 18 июня 2020

Как я (и @Klaus D.) предложил, один из способов справиться с ситуациями, подобными этой, когда используемый синтаксис несовместим с более ранними версиями интерпретатора, - это поместить код, использующий синтаксис, в другой сценарий и только import это, если версия равна или выше необходимого минимума.

Тем не менее, другой способ сделать это - «спрятать» ошибочный код в строке и выполнять эту строку только в том случае, если проверка версии проходит:

Вот что я имею в виду:

import sys

if sys.version_info < (3, 6):
    sys.exit("Please use Python 3.6+")

exec("""
    def hello(name:str):
        print(f'Hello, {name}!')
""")

if __name__ == '__main__':
    hello('Jon')

Этот последний метод может быть несовместим с другими инструментами, которые вы можете использовать (например, mypy), в зависимости от какие они «умные» ...

...