Написание кода 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. Определения будущей формулировки
Что еще?
Ответы
Ответ 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()
.