Python 为什么这个函数被无限调用?

Python 为什么这个函数被无限调用?,python,recursion,sqlite,Python,Recursion,Sqlite,我正在编写一个代码,该代码应该使用递归函数(scan_folder)获取一些文件名,并使用第二个函数(update_db)将它们写入sqlite数据库 第一个问题是,无论何时scan_folder()调用自身,它都会立即调用update_db(),尽管它不应该这样做。因此,数据库会更新很多次。也许我可以在第二个函数完成后弹出传递给它的值,但我想知道为什么会发生这种情况 class Sub: def __init__(self, parent, scan_type): s

我正在编写一个代码,该代码应该使用递归函数(scan_folder)获取一些文件名,并使用第二个函数(update_db)将它们写入sqlite数据库

第一个问题是,无论何时scan_folder()调用自身,它都会立即调用update_db(),尽管它不应该这样做。因此,数据库会更新很多次。也许我可以在第二个函数完成后弹出传递给它的值,但我想知道为什么会发生这种情况

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()

这只是一种预感,但就在这里:

dot = Sub(current_path, self.scan_type)
您将其设置为等于子方法,并且在该方法中您有:

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

它通过ConnectionDatabase类调用自身,更新数据库位于该类中

当我调用扫描文件夹时,它会输入if/else语句,该语句获取当前目录中的每个文件和文件夹。当它在那里找不到任何其他内容时,它不会跳回上一个目录,而是调用update_db before


最好的办法是重新编写整个过程,如前所述,函数做的事情太多了。

请。这是一个代码转储,真的不公平,期望有人阅读所有这些。扫描文件夹做的太多了。尝试将所有任务拆分为较小的任务。这样,它将是可读的,并且更容易调试。根据经验,在大多数情况下,2个缩进就足够了。对不起,你能澄清一下吗?我不明白为什么会调用update_dbOh,对不起,我指的是子类,而不是方法。您的点变量引用的是您的子类,在该类中,您有一个方法“definit”,该方法使用“self”关键字自己调用函数。在这里,您正在引用您的ConnectionDatabase,您的“update_uu数据库”方法就在这里。由于“scan_folder()”方法中的函数“dot.scan_folder()”,该方法将自身循环。这也许可以解释为什么“update_database”会被反复调用。我将这些引用移出了类,但在每个dot.scan_文件夹调用后仍会调用update_db。我想我终于知道发生了什么,当我调用scan_folder时,它会进入其中,如果/else语句会获取当前目录中的每个文件和文件夹。当它在那里找不到任何其他内容时,它不会跳回上一个目录,而是调用update_db before。我认为最好的方法是重新编写代码,因为它是一个完全混乱的地方。谢谢你的帮助!