递归不使用更新的值

时间:2018-08-24 21:13:10

标签: python wordpress recursion woocommerce

我正在尝试获取40,000行CSV文件,并将每行变成SQL数据库中WordPress网站的有效WooCommerce产品信息。但是,许多行共享相同的信息,这些信息正变成和GUID。由于每个子弹和GUID都必须唯一,所以这就带来了一个问题。

我的解决方案是编写一个递归函数:

  1. 查询数据库以查看是否已存在段符或GUID
  2. 如果已经存在,请使用数字更新该段和GUID,然后再次运行该功能。

我遇到的问题是,当我在return语句中递归引用该函数时,它实际上什么也没做。

我可以确认参数确实在更新,但是该函数实际上并没有使用更新后的参数运行。

参见下文:

    def postCheck(guid, slug, num) :
        cursor.execute("select * from wp_site_posts where post_type='product' and guid='"+guid+"' and post_name='"+slug+"'")
        posts = cursor.fetchall()
        try:
            if (guid == posts[0][18]):
                print('Existing slug/guid: ' + slug + ' / ' + guid)
                slug = slug + '-' + str(num)
                guid = 'http://site.test/product/'+ slug
                num += 1
                return postCheck(guid, slug, num)
        except IndexError:
            return

    postCheck(guid_var, slug_var, 1)

我完全不知道为什么这不起作用。我已经检查了StackOverflow,看来其他人要记住的主要问题是在再次调用该函数之前记得包括“ return”关键字。

2 个答案:

答案 0 :(得分:0)

如果您的guid尚未在数据库中-也就是说,当if的测试为false时-您的函数将不执行任何操作,因为它没有else,几乎没有if之后的其他代码。

return放在递归调用之前意味着您永远不会进行递归调用。

一种更好的方法可能是将搜索新的guid放在一个循环中,直到找到一个新的guid,然后在该循​​环之后找到一个新的guid。

答案 1 :(得分:0)

您的函数无法将值返回给调用程序。您的递归中没有基本情况。重复进行直到得到IndexError;此时,您将返回无值(即None),直到将堆栈爬回到调用程序为止。

您需要一个基本情况:一个if会识别“这就是我真正要寻找的东西”,并返回那个值,而不是您从{{1 }}。另外,可以在exception子句中返回该值。