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

Обратная совместимость входных вызовов в 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

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

4b9b3361

Ответ 1

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

try:
    input = raw_input
except NameError:
    pass

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

Ответ 2

Этот код преподаётся во многих программах обучения и обучения 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__ для импорта других языков. Существует также библиотека под названием "шесть", на которую можно найти решения для совместимости при решении других проблем.

Ответ 3

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

Ответ 4

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

from builtins import input

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