Обратно-совместимые входящие вызовы в Python - PullRequest
24 голосов
/ 03 мая 2011

Мне было интересно, есть ли у кого-нибудь предложения по написанию обратно совместимого вызова 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

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

Ответы [ 4 ]

32 голосов
/ 03 мая 2011

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

try:
    input = raw_input
except NameError:
    pass

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

9 голосов
/ 18 мая 2017

Этот код сейчас преподается во многих программах обучения и подготовки на Python.

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

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

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

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

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

1 голос
/ 13 июня 2017

Я предпочитаю импортировать функцию:

from builtins import input

Хотя вам нужно будет установить зависимость:

pip install future

К сожалению, эта зависимость не будет замечена инструментом pipreqs. Поэтому, если вы создаете requirements.txt файлы, вам придется добавить будущую библиотеку вручную.

1 голос
/ 03 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...