Получить команду из ввода - PullRequest
       6

Получить команду из ввода

0 голосов
/ 04 декабря 2011
commands = ['chat', 'call', 'exit', 'friends', 'status']

class MainHub(object):
    def menu(self):
        while True:
            selection = raw_input("> ")
            if selection != any(commands):
                print "Not a recognized command!\n"
            else:
                print selection

выводит «Не распознанная команда!»каждый раз, даже если выбор что-то вроде «чат» или «звонок».Это очень простой фрагмент кода, но я просто не могу понять, что с ним не так!

Ответы [ 4 ]

4 голосов
/ 04 декабря 2011

Вам не нужна функция any, вам нужен синтаксис not in:

if selection not in commands:

any взят из исчисления предикатов и проверяет, является ли какой-либо из его входных данных True.В этом случае вы сравниваете свой ввод с any(commands), то есть True, поскольку в commands есть элемент True.

3 голосов
/ 04 декабря 2011

selection! = Any (команды)

Кажется, это очень распространенный класс ошибок для начинающих, хотя я только начал замечать это недавно.Другая распространенная попытка - использовать такие вещи, как value == (3 or 4 or 5), что по сути является той же ошибкой.

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

То, что вы написали, означает "если selection не равно (истина-значение того, является ли любой из commands истинным) ".Вызов функции возвращает либо True, либо False (фактически, он возвращает True, потому что хотя бы одна из commands является непустой строкой - фактически они все являются - и непустыми строкамиравны true-ish, а пустые строки - false-ish), и вы сравниваете selection с этим значением.Она никогда не будет равной, потому что selection - это строка, а строки - это даже не то же самое, что True или False, которые являются логическими значениями, не говоря уже о равенстве.

Что выимелось в виду «если selection не является одним из commands», т. е. «если это не тот случай, когда selection содержится в commands».Это вопрос членства в наборе, а не сравнения.

В Python мы выполняем тестирование членства в множестве, используя ключевое слово in.Грамматика позволяет нам писать совершенно естественное звучание if selection not in commands:, поэтому нам не нужно идти на компромисс с if not (selection in commands):.

1 голос
/ 04 декабря 2011

any() возвращает True, если хотя бы один из элементов в итерируемом аргументе оценивается как True, а False в противном случае. Итак, ваш код здесь:

if selection != any(commands):

Вид commands - это список непустых (т. Е. «Истинных») строк, любая просто вернет True. Код оставлен как:

if selection != True:

Что не имеет смысла: D. Что вы хотите знать, так это если selection существует в списке команд, что вы можете сделать следующим образом:

if selection not in commands:

Ура!

0 голосов
/ 04 декабря 2011

Изменить эту строку:

if selection != any(commands):

Для этой другой строки:

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