Как мне реализовать данную функцию?

Мне нужно сделать своеобразную проверку на жанры. То есть у меня есть база данных, которая содержит в себе какую-то информацию о книге по ее индексу. Я выбираю какое-то рандомное число, нахожу эту книгу в базе данных по индексу, проверяю есть ли в ней необходимые мне жанры, и если нет, то функция запускается по новой уже с другим числом. Когда такая книга находится, то нужно выводить какую-либо информацию о ней, но это уже не так важно

conn = sqlite3.connect('booksrec.db')
curs = conn.cursor()

my_genres = ['Historical', 'Fantasy', 'Business']
number_of_books = random.randint(0, 9999)

def kniga(number):
    curs.execute(f'SELECT * FROM books WHERE "index" = "{number_of_books}"')
    book = curs.fetchone()
    for element in my_genres:
        if element in book[5]:
            print(book[2])
        else:
            kniga(random.randint(0, 9999))

kniga(number_of_books)

При таком написании вылезает ошибка о превышении глубины рекурсии. Что можно сделать в данной ситуации?


Ответы (1 шт):

Автор решения: CrazyElf

Ну избавиться то от рекурсии легко:

def kniga(number):
    while True:
        number_of_books = random.randint(0, 9999)
        curs.execute(f'SELECT * FROM books WHERE "index" = "{number_of_books}"')
        book = curs.fetchone()
        found = True
        for element in my_genres:
            if element not in book[5]:
                found = False
                break
        if found:
            print(book[2])
            break

Но подход изначально порочный. Вы можете много раз выбирать одни и те же книги на проверку. И зря будете дёргать базу, если нужных книг там немного. Лучше всё-таки придумать, как вынуть из базы только подходящие по критерию книги и из них уже выбрать одну случайную.

P.S. Переделал проверку на более правильную, если нужны все три жанра. Если достаточно совпадения одного жанра из списка, проверку нужно будет переделать.

→ Ссылка