2014-09-14 6 views
0

Я использую этот код от друга, и когда я бег Heroku это дает мне эту ошибку:user_tweets - Что происходит с моим кодом на Python?

Traceback (most recent call last): 
    File "ebooks.py", line 79, in <module> 
    source_tweets_iter, max_id = grab_tweets(api,max_id) 
    File "ebooks.py", line 51, in grab_tweets 
    max_id = user_tweets[len(user_tweets)-1].id-1 
IndexError: list index out of range 

Ну, я знаю, эта ошибка говорит о каком-то пустом списке (Какого список ? Я не знаю, что это значит, поэтому, пожалуйста, помогите мне) и код проблематичной линии принадлежат ebooks.py, вот это:

def grab_tweets(api, max_id=None): 
    source_tweets=[] 
    user_tweets = api.GetUserTimeline(
     screen_name=user, count=200, max_id=max_id, include_rts=True, 
     trim_user=True, exclude_replies=True) 
    max_id = user_tweets[len(user_tweets)-1].id-1 

    for tweet in user_tweets: 
     tweet.text = filter_tweet(tweet) 
     if len(tweet.text) != 0:  
      source_tweets.append(tweet.text) 

return source_tweets, max_id 

происхождение al ebooks.py вы можете найти здесь: https://gist.github.com/laurenorsini/f38c0113e41e9b4504a7

Ну, друзья, извините за мой английский :(Вы можете мне помочь?

+0

Чтобы отформатировать код, отпечатайте каждую строку кода на дополнительные 4 пробела. Вы можете выделить несколько строк текста, выделив их все и нажав ctrl + k. – Michael0x2a

ответ

2

Что произойдет, если нет пользовательских твитов, и если user_tweets был пустым?

Тогда, делая user_tweets[len(user_tweets) - 1], было бы равнозначно исполнению user_tweets[0 - 1], что составляет user_tweets[-1]. Если вы делаете my_list[-1], вы говорите Python, чтобы искать последний элемент в списке.

Однако user_tweets пуст, тогда невозможно извлечь последний элемент - в списке ничего нет. Таким образом, Python генерирует исключение.

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

def grab_tweets(api, max_id=None): 
    user_tweets = api.GetUserTimeline(
     screen_name=user, count=200, max_id=max_id, include_rts=True, 
     trim_user=True, exclude_replies=True) 

    if len(user_tweets) > 0: 
     source_tweets=[] 
     max_id = user_tweets[len(user_tweets)-1].id-1 

     for tweet in user_tweets: 
      tweet.text = filter_tweet(tweet) 
      if len(tweet.text) != 0:  
       source_tweets.append(tweet.text) 

     return source_tweets, max_id 
    else: 
     # return a default value? 
     # throw an exception? 
+0

Теперь код возвращается с этим (если я изменяю его на ваш код) ;; Запуск 'worker' подключен к клемме ... вверх, run.4420 Файл "ebooks.py", строка 67 если __NAME __ == "__ main__": ^ IndentationError: ожидается отступом блок –

+0

@PabloMurad - Вы смешиваете вкладки и пробелы? Я оставил блок «else» пустым - вы обязательно поместили что-то внутри? – Michael0x2a

+0

В 'else' вы должны' return [], 0' для этого конкретного приложения, иначе вы получите сообщение об ошибке позже в коде. Это правильный ответ, и он должен быть отмечен как таковой. –

0

Где вы настройки пользователя?

Чтобы поймать ошибку я бы сделать что-то вроде этого:

def grab_tweets(api, max_id=None): 
    source_tweets=[] 
    user_tweets = api.GetUserTimeline(
     screen_name=user, count=200, max_id=max_id, include_rts=True, 
     trim_user=True, exclude_replies=True) 
    # if you're expecting it to succeed, use a try 
    try: 
     max_id = user_tweets[len(user_tweets)-1].id-1 
    # if user_tweets is empty an IndexError is raised 
    except IndexError: 
     # do any internal logging here before the return 
     return source_tweets, None 

    for tweet in user_tweets: 
     tweet.text = filter_tweet(tweet) 
     if len(tweet.text) != 0:  
      source_tweets.append(tweet.text) 

    return source_tweets, max_id 

Или, если вы предпочитаете использовать, если:

def grab_tweets(api, max_id=None): 
    source_tweets=[] 
    max_id = None 
    user_tweets = api.GetUserTimeline(
     screen_name=user, count=200, max_id=max_id, include_rts=True, 
     trim_user=True, exclude_replies=True) 
    # you can use an if to prevent the error 
    if len(user_tweets): 
     max_id = user_tweets[len(user_tweets)-1].id-1 

     for tweet in user_tweets: 
      tweet.text = filter_tweet(tweet) 
      if len(tweet.text) != 0:  
       source_tweets.append(tweet.text) 

    return source_tweets, max_id 

Так что поймает свою ошибку, но вы все равно нужно протестировать и убедиться, что он работает, когда вы знаете, что он должен возвращать заполненный список. Проверьте, что пользователь настроен правильно, работает API и т. Д.

+0

Я полагаю, что user_tweets относится к учетной записи twitter, верно? Так что взгляните на www.twitter.com/aphexpredator, нет пустых твитов, я не знаю, почему он возвращается с этим, но я постараюсь! –

+0

ps: похоже, «работает», но приложение не отправляется, новая ошибка !!! lol –

+0

Но в вашем фрагменте кода нет ссылки на «пользователь», так что вы уверены, что он настроен правильно и не является пустой или неправильной строкой? –

Смежные вопросы