Обратная совместимость входных вызовов в 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
Я уверен, что есть лучший способ сделать это, хотя. У кого-нибудь есть предложения?
Ответы
Ответ 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