Обратная совместимость входных вызовов в Python

Мне было интересно, есть ли у кого-нибудь предложения по написанию обратно совместимого вызова input() для получения пути к файлу?

В Python 2.x raw_input отлично работал для ввода типа /path/to/file. Использование ввода в этом случае отлично работает для 3.x, но ругается в 2.x из-за поведения eval.

Одним из решений является проверка версии Python и, в зависимости от версии, сопоставление input или raw_input с новой функцией:

if sys.version_info[0] >= 3:
    get_input = input
else:
    get_input = raw_input

Я уверен, что есть лучший способ сделать это. У кого-нибудь есть предложения?


person Keith Hughitt    schedule 03.05.2011    source источник
comment
Если вы пишете код, который должен работать на Python 2 и Python 3 без использования 2to3, вам нужно следующее: pypi .python.org/pypi/six Он уже решил многие подобные проблемы для вас. Он также работает как хороший пример того, как решать подобные проблемы (хотя на самом деле он не делает этого для input()). Другие способы сделать это используют 2to3. См. python3porting.com/strategies.html.   -  person Lennart Regebro    schedule 03.05.2011


Ответы (4)


Поскольку версия input() для Python 2.x практически бесполезна, вы можете просто перезаписать ее на raw_input:

try:
    input = raw_input
except NameError:
    pass

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

person Sven Marnach    schedule 03.05.2011

Этот код сейчас преподается во многих образовательных и обучающих программах Python.

Обычно учат вместе:

from __future__ import print_function
if hasattr(__builtins__, 'raw_input'):
    input = raw_input

Первая строка: импортирует функцию print() Python 3.x в Python 2.7, поэтому print() ведет себя одинаково в обеих версиях Python. Если это сломает ваш код из-за старых вызовов print "some content", вы можете оставить эту строку отключенной.

Вторая и третья строки: устанавливает для Python 2.7 raw_input() значение input(), чтобы input() можно было без проблем использовать в обеих версиях Python. Это можно использовать само по себе, если это единственное исправление совместимости, которое вы хотите включить в свой код.

На сайте Python.org доступно больше импортов from __future__ для других проблем совместимости языков. Существует также библиотека под названием «шесть», в которой можно найти решения для совместимости при решении других проблем.

person TMWP    schedule 18.05.2017

То, как вы справляетесь с этим, просто прекрасно. Вероятно, есть и более похожие способы использования модуля sys, но имейте в виду, что если ваша программа делает что-то большее, чем тривиальное со строками и файлами, лучше иметь две версии вашей программы вместо обратно совместимого python3. программа.

person Senthil Kumaran    schedule 03.05.2011

Вы можете импортировать функцию:

from builtins import input

К сожалению, хотя этот метод требует внешней зависимости через pip install future

person AlexG    schedule 12.06.2017