为什么函数不将var`db`返回到下一个函数?

时间:2017-02-09 23:59:04

标签: python function python-3.x class

class Database: 
    def set_db_setting(self, host, username, passwd, database):
        try:
            db = pymysql.connect(host=host, user=username, passwd=passwd, db=database)
        except:
            print('\nerror connecting to database\n')
    return db

失败的功能

    def db_select(self, *selected_fields, **kwargs):
        self.selected_fields = selected_fields = list(selected_fields)
        self.table = (kwargs['table']
                      if 'table' in kwargs 
                      else selected_fields.pop())

        self.where_field = (kwargs['where_field']
                            if 'where_field' in kwargs
                            else selected_fields.pop())
        try:
            with db.cursor() as cursor:
                sql_tld_id_query = Database.query_stmt_list[0]+ selected_fields + Database.query_stmt_list[4] + table + Database.query_stmt_list[5] + where_field + '=' + 'www.website.com'

        except Exception as gatherid_err:
            print("exception was {}".format(gatherid_err))
            db.rollback()

当我在最后实例化它失败时:

dbclass = Database()
dbclass.set_db_setting('localhost', 'root', 'password', 'garbagedb')
dbclass.db_select(['id', 'name'], table='tld', where_field='name')

更新错误

exception was Can't convert 'list' object to str implicitly

在这一行:

sql_tld_id_query = Database.query_stmt_list[0]+ selected_fields + Database.query_stmt_list[4] + table + Database.query_stmt_list[5] + where_field + '=' + 'www.website.com'

我尝试将其更改为:

sql_tld_id_query = str(Database.query_stmt_list[0]+ selected_fields + Database.query_stmt_list[4] + table + Database.query_stmt_list[5] + where_field + '=' + 'www.ebay.com')

但这并没有解决它。有人可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

对于初学者来说,缩进很重要。退货声明不在set_db_setting()内,因此它不会返回任何内容。

其次,函数内定义的变量有一个范围,它仅限于函数内部,因此db不会在两个方法调用之间神奇地传输。您要么将其存储在self.db中(并在db_select()中引用它,或者您希望从set_db_setting()返回它,将其存储在局部变量中,然后显式传递<强>那到db_select()作为参数。

使用self.db&amp;将它作为实例变量存储将是更常规的编写代码的方式。

答案 1 :(得分:0)

您的函数似乎没有设置名为db的类变量。它只是返回该值。然后在您的课程中,您尝试访问尚未设置的变量。

我相信你需要这样的东西。

class Database: 
    db = None
    def set_db_setting(self, host, username, passwd, database):
        try:
            self.db = pymysql.connect(host=host, user=username, passwd=passwd, db=database)
        except:
            print('\nerror connecting to database\n')

现在变量已设置,类中的其他方法可以访问它。

答案 2 :(得分:0)

根据你透露的代码

这里你放弃了调用的结果(这是你通过“return db”返回的)

T - item[i]

在这里你要调用你从未实例化过的东西:

dbclass.set_db_setting('localhost', 'root', 'password', 'garbagedb')

所以你想知道什么?

然后,即使您不忘记将调用结果分配给变量 - 您也没有将其传递给第二个函数。 这意味着,您将把它用作全局变量。

在反模式中,这绝对是公爵,如果不是国王的话。 一定要避免这种情况。

PS并了解变量范围是什么。