Почему эта функция вызывается бесконечно? - PullRequest
0 голосов
/ 09 апреля 2019

Я пишу код, который должен получить некоторые имена файлов, используя рекурсивную функцию ( scan_folder ) и записываю их в базу данных sqlite со второй функцией ( update_db ).

Первая проблема заключается в том, что всякий раз, когда scan_folder () вызывает себя, он сразу же вызывает update_db () , хотя это не должно быть. Из-за этого база данных обновляется A LOT . Возможно, я мог бы вытолкнуть значения, которые передаются второй функции после ее завершения, но я хотел бы знать, почему это происходит.

class Sub:

    def __init__(self, parent, scan_type):
        self.database = ConnectionToDatabase()
        self.database_name = ConnectionToDatabase().database_name()

    def scan_folder(self):
        connection = sqlite3.connect(self.database_name)

        try:
            cursor = connection.cursor()

            for file_name in os.listdir(self.parent):
                if file_name.endswith('.srt'):
                    if self.scan_type is True:
                        cursor.execute('SELECT count(*) FROM subs WHERE name = ?', (file_name,))

                else:
                    current_path = "".join((self.parent, "/", file_name))
                    if os.path.isdir(current_path):
                        dot = Sub(current_path, self.scan_type)

                        # I THINK HERE IS THE ERROR, ACCORDING TO PYCHARM DEBUGGER
                        # HERE THE update_db() IS CALLED AND ONLY AFTER IT FINISHES, dot.scan_folder() BEGINS
                        dot.scan_folder()

            connection.close()  # Closes connection that adds subtitle names into the database

        finally:
            self.database.update_database(dirty_files_amount)

Здесь начинается вторая функция:

class ConnectionToDatabase:
    def __init__(self):
        self.database = './sub_master.db'

    def update_database(self, dirty_files_amount):
        connection_update = sqlite3.connect(self.database)
        cursor = connection_update.cursor()

            for sub_name in to_update:
                cursor.execute('UPDATE subs SET ad_found = 1 WHERE name = ?', (sub_name,))
                connection_update.commit()

        connection_update.close()

Ответы [ 2 ]

0 голосов
/ 09 апреля 2019

когда я вызываю scan_folder, он входит в оператор if / else, который получает каждый файл и папку в текущем каталоге. Когда он не находит там ничего другого, вместо того, чтобы вернуться к предыдущему каталогу, он вызывает update_db раньше.

Лучшее, что можно сделать, - это просто переписать все, как было сказано ранее, функции делают слишком много вещей.

0 голосов
/ 09 апреля 2019

Это просто догадка, но прямо здесь:

dot = Sub(current_path, self.scan_type)

Вы устанавливаете его равным вашему под-методу, и в этом методе у вас есть:

 self.database = ConnectionToDatabase()
 self.database_name = ConnectionToDatabase().database_name()

Это вызывает себя через ваш класс ConnectionToDatabase, где находится ваш update_db

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