Подтвердить что ты не робот

Написание кода Python 2.7, максимально приближенного к синтаксису Python 3.x

Так как Django еще не поддерживает Python 3.x, я использую Python 2.7. Однако я хотел бы продолжить знакомство с новым синтаксисом Python 3.x как можно больше. Это приводит меня к вопросу:

  • Каков наилучший способ написать код Python 2.7, который будет максимально совместим с Python 3.x?

Я знаю, что запуск python -3 будет

Предупреждать о несовместимости Python 3.x, что 2to3 не может быть тривиально исправлено.

Однако, я заинтересован в использовании синтаксиса Python 3.x при использовании Python 2.7.

Например, кажется, что я должен использовать следующий импорт для моего кода:

from __future__ import print_function
from __future__ import unicode_literals
from __future__ import division
from __future__ import absolute_import

Вышеуказанные четыре оператора __future__ import требуются с Python 3.0, но не требуются в 2.7, как описано в Документация Python 2.7.3 27.11. Определения будущей формулировки

Что еще?

4b9b3361

Ответ 1

В настоящее время многие модули переписываются таким образом, что позволяют выполнять как на Python 2, так и на Python 3. Это оказывается совсем не сложно, и в будущем будет очень легко просто отказаться от поддержки Python 2.

Взгляните на модуль six, который помогает с этой задачей, инкапсулируя многие из различий удобным образом:

Six предоставляет простые утилиты для обертывание различий между Python 2 и Python 3.

На его веб-сайте (и, конечно же, в коде) перечислены многие способы сделать это возможным.

Ответ 2

Поместите следующий код в модуль py3k.py и импортируйте его следующим образом: from py3k import *. Однако вам нужно поместить его в каждый файл, но вы даже можете оставить его там, если никто больше не использует Python 2.x, или вы можете просто искать и заменять строку импорта пробелом, а затем удалять файл.

try:
    from future_builtins import *
except ImportError:
    pass

try:
    input = raw_input
    range = xrange
except NameError:
    pass

И вот так выглядит мой файл шаблона:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""

"""

from __future__ import division, absolute_import, \
                       print_function, unicode_literals
from utils.py3k import *  # @UnusedWildImport


#

Ответ 3

Вам также необходимо использовать новые синтаксисы исключений, то есть больше

try:
     raise Exception, "Message"
except Exception, e:
     pass

вместо этого вы должны:

try:
     raise Exception("Message")
except Exception as e:
     pass

Также убедитесь, что вы префикс всех ваших двоичных строк с помощью b, то есть:

b 'Это двоичная строка'

Более полное описание этой темы см. в разделе http://python3porting.com/noconv.html

Ответ 4

Многие Python IDE могут оказать здесь большую помощь.

PyCharm, например, можно настроить для проверки совместимости с любым диапазоном версий,

enter image description here

и сообщите о проблемах на любом уровне серьезности:

enter image description here

Ответ 5

try:
    input = raw_input
    range = xrange
except NameError:
    pass

Являются ли два, которые spring для ума...

Ответ 6

Я предлагаю вам попробовать будущая библиотека. На своем сайте:

python-future - это недостающий уровень совместимости между Python 2 и Python 3. Он позволяет использовать одну чистую совместимую с Python 3.x-кодовую базу для поддержки как Python 2, так и Python 3 с минимальными издержками.

Он предоставляет будущие и прошлые пакеты с backports и пересылает порты функций из Python 3 и 2. Он также поставляется с футуровыми и пастеризованными настраиваемыми скриптами на основе 2to3, которые помогут вам легко конвертировать Py + или Py3 код для поддержки Python 2 и 3 в одной чистой кодовой базе кода Py3, модуль по модулю.

Известными проектами, использующими python-future для совместимости с Python 2/3, являются Mezzanine и ObsPy.

Ответ 7

Avoing range() и zip(), используя вместо xrange() и itertools.izip().