2014-10-18 3 views
5

Я хочу официально отказаться от поддержки python 2 для программы, которую я поддерживаю, и в полной мере использовать возможности python 3. Вместо того, чтобы иметь программу, которая работает более или менее под управлением python 2, но не справляется со странным поведением в угловых случаях, я хотел бы официально разбить мою программу на python 2 с явным сообщением об ошибке «пожалуйста, используйте python 3 вместо». Какой самый разумный способ провалиться с ошибками для неподдерживаемых версий python?Есть ли стандартный способ объявить старые версии python неподдерживаемыми?

Например, я хотел бы импортировать код в python 2 (по крайней мере, пакет верхнего уровня), чтобы вызвать ошибку, а для моего скрипта setup.py distutils ошибка при попытке установить или создать его для python 2 (даже при вызове через python 3, например python3 setup.py sdist_dsc --with-python2). Я также хотел бы включить любые соответствующие метаданные, чтобы официально объявить, какие версии python я поддерживаю. Есть поле Requires-Python в PEP 345, но я не думаю, что это важно, если я не использую distutils2.

+0

Я бы тоже отлично пощечины какой-то перевод 3to2 на него для лучшей совместимости с python 2 назад, но IIUC - это ручной процесс и не предлагает каких-либо простых переводов на лету. –

ответ

5

Для предотвращения импорта, поместите это в верхней части модуля:

import sys 

if sys.version_info[0] < 3: 
    raise ImportError('Python < 3 is unsupported.') 

Чтобы предотвратить Устанавливая, поставить это в верхней части setup.py:

import sys 

if sys.version_info[0] < 3: 
    sys.exit('Python < 3 is unsupported.') 

Это будет разрушаться и перед проверкой если вы используете синтаксис, который несовместим с Python 2, поскольку модуль будет проанализирован перед запуском. Обнаружение может быть излишним для поддержки «не поддерживающего Python 2».

Но я на самом деле не видел это на практике. Большинство сопровождающих просто говорят, что поддерживается, и не утруждайте себя проверкой.

+0

'sys.exit' будет использоваться только для' setup.py', а пример, создающий исключение, которое вы первоначально использовали для импорта. Не могли бы вы объяснить различные сценарии в своем ответе? Сейчас он просто говорит: «Наденьте сверху». –

+0

@MuMind: Если модуль может быть импортирован и запущен как скрипт, тогда 'if __name__ == "__main __" ', то он запускается как скрипт. – jfs

3

Стандартный способ, чтобы установить classifiers в setup.py:

if sys.version_info < (3, 3): 
    sys.exit("error: this script requires Python 3.3 or greater.") 

setup(..., 
classifiers=[ 
     'Programming Language :: Python :: 3', 
     'Programming Language :: Python :: 3.3', 
     'Programming Language :: Python :: 3.4', 
     # ... other non-version info 
    ], 
    ...) 

Например, tulip project (asyncio) supports only Python 3.3.

Вы также можете добавить в пакет __init__.py:

if sys.version_info < (3, 3): 
    raise ImportError("Python 3.3 or greater is required") 
2

Я бы с @davidsm ответ, но вместо этого я просто возбудит исключение:

import sys 

if sys.version_info[0] < 3: 
    raise ImportError('Only Python 3 is supported.') 
+0

Наверное, должен был просто комментировать этот ответ, но я согласен с этим предложением. =) –

+0

Зачем регистрировать журнал? –

Смежные вопросы