Хотите запустить бота PRAW, который печатает оператор else только один раз

Я пишу креветочного бота, который проходит через определенный сабреддит и захватывает заголовки каждого поста в пределах определенного лимита, 20 постов. Затем он пытается определить, существует ли конкретная строка («word_to_find») в заголовке каждого сообщения.

Я хочу, чтобы бот распечатал строку «Не могу найти статьи Kawhi в сабреддите!» если он не находит указанное слово "word_to_find" ни в одном из заголовков сообщений.

Однако я хочу, чтобы бот печатал указанную выше строку только один раз, и только если word_to_find не существует ни одного из найденных заголовков.

Однако, когда оператор else выполняется в моем цикле for, он распечатывает сообщение с найденной строкой «word_to_find» и оставшееся количество сообщений с указанной выше строкой, все в пределах 20.

Надеюсь, все это имеет смысл. Ниже мой текущий код.

    def run_bot():
        sub = r.subreddit('nba')
        print("---Grabbing subreddit---\n")
        subs = sub.top('week', limit=20)
        print("---Grabbing posts in sub---\n")
        print("Looking for Kawhi Articles..\n")
        for posts in subs:
            article_url = posts.url
            post_title = posts.title
            word_to_find = "Kawhi"

            if word_to_find in post_title:
                print(post_title)



            else: 
                print("Can't find Kawhi articles in the 
                         subreddit!")

   run_bot()

person nick_rinaldi    schedule 25.05.2019    source источник
comment
Ваш текущий else должен запускаться один раз, когда ни один из posts в subs не имеет word_to_find, верно? Вы можете поддерживать логическую переменную и печатать сообщение только в том случае, если она верна после завершения цикла for.   -  person TheGamer007    schedule 25.05.2019


Ответы (1)


В следующем коде предполагается, что вы хотите перебрать все сообщения независимо от того, найдете ли вы сообщение, в котором word_to_find содержится в post_title.

def run_bot():
    sub = r.subreddit('nba')
    print("---Grabbing subreddit---\n")
    subs = sub.top('week', limit=20)
    print("---Grabbing posts in sub---\n")
    print("Looking for Kawhi Articles..\n")

    not_in_any_post = True
    for posts in subs:
        article_url = posts.url
        post_title = posts.title
        word_to_find = "Kawhi"

        if word_to_find in post_title:
            print(post_title)
            not_in_any_post = False
        else:
            not_in_any_post = not_in_any_post and True

    if not_in_any_post:
        print("Can't find Kawhi articles in the subreddit!")

run_bot()

Флаг not_in_any_post будет True только в том случае, если НИ ОДИН из сообщений не имеет word_to_find.

Если вы хотите распечатать сообщение один раз, как только будет обнаружен заголовок, в котором нет word_to_find, вы можете использовать существующий код при добавлении оператора break в блок else. Однако это означает, что он не будет повторять оставшиеся сообщения.

person TheGamer007    schedule 25.05.2019