использовать переменную внутри ввода для python27 терпит неудачу с проблемами синтаксиса - PullRequest
0 голосов
/ 27 июня 2018

У меня есть следующий код, который работает как в Py 27 и 36:

all_config_msgs = ['Okta App URL. E.g https://acme.okta.com/home/amazon_aws/b07384d113edec49eaa6/123: ','Organization username. E.g jane.doe@acme.com: ']
config_details = []
for config_msg in all_config_msgs:
    config_details.append(input(config_msg))

В py 36 и 27 я получаю приглашение ввода:

URL-адрес приложения Okta. Например, https://acme.okta.com/home/amazon_aws/b07384d113edec49eaa6/123:

  • в py 36, я положил:

any_reply

и он успешно проходит

  • в пи 27, я положил:

any_reply

, который не работает с

config_details.append(input(config_msg))
File "<string>", line 1
https://acme.okta.com/home/amazon_aws/b07384d113edec49eaa6/123
     ^
SyntaxError: invalid syntax

К вашему сведению - в py 27 это работает, если я поставлю ответ как "any_reply" но мне нужен способ ответа без двойных кавычек / кавычек.

Я понимаю, что в py 27, input выполняет eval, но что является хорошим способом получить приглашение ввода в качестве переменной без получения вышеуказанной ошибки.

Ответы [ 3 ]

0 голосов
/ 27 июня 2018

Денис ответил правильно. Вы можете условно использовать функцию. Это невероятно распространенный паттерн в Python, особенно если вам нужна совместимость с разными версиями.

try:
    my_input = raw_input
except NameError:
    my_input = input

all_config_msgs = ['Okta App URL. E.g https://acme.okta.com/home/amazon_aws/b07384d113edec49eaa6/123: ','Organization username. E.g jane.doe@acme.com: ']
config_details = []
for config_msg in all_config_msgs:
    config_details.append(my_input(config_msg))

Протестировано и работает в Python 2.7 и 3.5, но оно будет работать и для ваших версий.

Еще один вариант, который немного оспаривается, потому что некоторые люди странно относятся к изменению глобальных имен, - это просто принудительно указать, что raw_input существует, или определить его:

try:
    _ = raw_input
except NameError:
    raw_input = input
0 голосов
/ 27 июня 2018

вы можете использовать шесть библиотек для решения проблем совместимости

0 голосов
/ 27 июня 2018

На Python 2.7 вы должны использовать raw_input.

Если вы хотите поддерживать несколько версий Python, вы можете создать свою собственную функцию, которая будет работать как на Python 2, так и на 3:

def my_input():
    try:
        return raw_input()
    except NameError:
        return input()

Вы также можете воспользоваться библиотекой six , которая может помочь вам с проблемами совместимости:

from six.move import input

Это будет использовать raw_input в Python 2 и input в Python 3.

...