2014-02-14 5 views
0

Я пытаюсь создать приложение фильтра Twitter, которое будет искать вашу личную тайну людей, за которыми вы будете следовать/RT от людей, которых вы придерживаетесь по ключевым словам по вашему выбору. (Это не вопрос, это фон ... Я еще не до этого, я просто играю с API на данный момент!)Неправильно вырваться из цикла python while?

Я только начинаю изучать Python, m ранее Java-программист, и мне интересно, как проверить ввод пользователя для правильного ... ну, вход!

У меня есть пронумерованное меню (в настоящее время только с двумя элементами), и я хочу, чтобы пользователь набирал 1 или 2, а если нет, то он должен выдать сообщение об ошибке и вернуться к вводу. В настоящее время я получаю сообщение об ошибке:

Traceback (most recent call last): 
    File "Filtwer.py", line 31, in <module> 
    if "1" in menuselect: 
TypeError: argument of type 'int' is not iterable 

Если строка 31 является началом инструкции if в приведенном ниже кодовом блоке. Я не уверен, что я что-то упустил? Например, не вырваться из цикла while? Любая помощь приветствуется!

Спасибо :)

import twitter 
api = twitter.Api(consumer_key='<redacted>', 
        consumer_secret='<redacted>', 
        access_token_key='<redacted>', 
        access_token_secret='<redacted>') 

while True: 
    menuselect = input("1. Tweet\n2. Get Tweets\n...: ") 
    if menuselect == 1 or 2: break 
    print "Please enter a valid entry!" 

if "1" in menuselect: 
    statusinput = raw_input("Tweet: ") 
    status = api.PostUpdate(statusinput) 
    print "Sucessfully tweeted!" 

else: 
    timeline5 = api.GetUserTimeline(user_id=<my_twitter_ID>, screen_name='<my_twitter_screenname>', count=5, include_rts='true') 
    print [s.text for s in timeline5] 

Edit:

Понял работать, как это (включены комментарии, чтобы показать, как мой ответ отличался от ответа, я выбрал правильный Спасибо за помощь, ребята. ! :))

while True: 
#try: 
    menuselect = raw_input("1. Tweet\n2. Get Tweets\n...: ") 
    if menuselect == "1" or menuselect == "2": break 
#catch ValueError: 
# pass 
#finally: 
    print "Please enter a valid entry!" 

if "1" == menuselect: 
[...] 
+0

'если menuselect == 1 или 2: break' должен быть' если menuselect в (1, 2): break' , – hughdbrown

ответ

3

Чтобы проверить menuselect является 1, вы должны использовать == оператор NOT in оператор. (Поскольку in оператор используется для проверки существования члена)

if 1 == menuselect: 

Примечание: Кроме того, не использовать input функцию в Python 2.x, чтобы получить ввод от пользователя (из-за соображений безопасности) , Используйте raw_input вместо и конвертировать результат в int вручную как этого

menuselect = int(raw_input("1. Tweet\n2. Get Tweets\n...: ")) 

Примечание 2: Вы можете использовать in оператор в состоянии break (правильно здесь, потому что вы проверяете ли значение menuselect является одним из возможных значений), как это

if menuselect in (1, 2): break 

, потому что

if menuselect == 1 or 2: 

всегда будет оцениваться как True, так как он оценивается как (menuselect == 1) or 2, даже если menuselect не 1, то часть 2 произведет выражение на Truthy.

Edit: Чтобы обойти части исключения, когда строка вводится вместо чисел, вы можете использовать try..except как этот

while True: 
    try: 
     menuselect = input("1. Tweet\n2. Get Tweets\n...: ") 
     if menuselect int (1, 2): break 
    catch ValueError: 
     pass 
    finally: 
     print "Please enter a valid entry!" 
+0

Я изменил его на это, но он все еще выходит из цикла while раньше. Теперь, если вы вводите что-либо, кроме 1, оно переходит в «else» и получает последние 5 твитов из моего профиля. – admrply

+0

@AutomatedRandomated Пожалуйста, проверьте «Примечание 2» в моем ответе. – thefourtheye

+0

Ах, хорошо, что 'if menuselect в (1, 2): break' исправляет проблему с недействительным целым числом, но что, если кто-то пытается ввести символ или строку. Теперь он выдает ошибку, если введен не-int? – admrply

1

Еще одна проблема, у вас есть с этой строкой:

if menuselect == 1 or 2: break 

Python интерпретирует это как

if (menuselect == 1) or 2: break 

Это значит, что если menuselect является одним, а если оно ложно, оно проверяет, является ли значение 2. В python ненулевые числа интерпретируются как истинные, поэтому это условие всегда будет истинным.

Измените это либо

if menuselect in [1, 2]: break 

или более длительный

if menuselect == 1 or menuselect == 2: break 
Смежные вопросы