Python 接受列表作为类方法中的参数-name';选定的#u字段';没有定义

Python 接受列表作为类方法中的参数-name';选定的#u字段';没有定义,python,python-3.x,Python,Python 3.x,我有一个类数据库,看起来像: 已更新 class Database(): query_stmt_list = ['SELECT','INSERT','UPDATE','DELETE','FROM','WHERE'] def db_select(self, *selected_fields, **kwargs): self.selected_fields = selected_fields = list(selected_field

我有一个类
数据库
,看起来像: 已更新

    class Database():
        query_stmt_list = ['SELECT','INSERT','UPDATE','DELETE','FROM','WHERE']

        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 = self.query_stmt_list[0]+ selected_fields + self.query_stmt_list[4] + table + self.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.db_select(*selected_fields, table='tld', where_field='name')
但我得到一个错误:

  line 51, in <module>
    dbclass.db_select(*selected_fields, table='tld', where_field='name')
NameError: name 'selected_fields' is not defined
第51行,在
dbclass.db\u select(*选定的\u字段,table='tld',其中\u field='name')
名称错误:未定义名称“所选字段”
谢谢。

如果您想解包“
选定的\u字段
”变量,如
dbclass.db\u select(*选定的\u字段,'tld','name')
,您最好:

  • 安装Python 3.5/3.6。在Python3.4及之前的版本中,类似此函数调用的语法是错误的。3.5引入的新特性被称为“附加解包泛化”,它允许用户放入由iterable解包运算符修饰的变量,即单个星号“
    *

  • 修改您的
    db\u select
    方法以应用一个技巧,该技巧可以在
    *selected\u字段之后接受两个额外参数,如下所示:

    def db_select(self, *args):
        self.selected_fields = selected_fields = list(args)
        self.where_field = selected_fields.pop()
        self.table = selected_fields.pop()
        ...
    
        def db_select(self, *args, **kwargs):
            self.selected_fields = selected_fields = list(args)
            self.where_field = (kwargs['where_field']
                                if 'where_field' in kwargs
                                else selected_fields.pop())
            self.table = (kwargs['table']
                          if 'table' in kwargs
                          else selected_fields.pop())
            ...
    
  • 如果希望
    db\u select
    方法也接受命名参数,例如
    dbclass.db\u select(*selected\u fields,table='tld',where\u field='name')
    ,可以这样做:

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

    您试图显示一个名为
    selected\u fields
    的变量,该变量未定义。我看不出复杂性在哪里。您没有在函数之外定义
    所选的\u字段。另外,您可能不希望调用它。@Goodies-如果我通过
    dbclass.db\u-select('somefield','someotherfield','tld','name')调用它,
    不会将'somefield','someotherfield','tld','name'视为
    所选字段的一部分。
    param
    dbclass.db\u-select(['somefield','someotherfield','tld','name'))
    。这看起来棒极了。我试过了,但它抛出了一个错误'dbclass.db\u select(*selected\u fields,table='tld',where\u field='name')NameError:name'selected\u fields'未定义'。你能看到我更新的代码吗?@Jshee:正如@kindall所说,在调用
    dbclass.db\u select
    @Philp之前,你需要定义变量
    selected\u字段
    -你看到更新的代码和错误了吗?我非常感谢你的邀请help@Philp-您的意思是:
    selected\u fields=['col1',col12']
    然后
    dbclass.dbselect(*selected\u fields,table='tld',where'u field='name')