【问题标题】:**kwargs not recognizing key 'table' - python 3.5**kwargs 无法识别关键“表”-python 3.5
【发布时间】:2017-06-29 06:25:00
【问题描述】:

当我调用它时,**kwarg 中的我的 kwarg table 没有得到识别。

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

    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())
        try:
            with self.db.cursor() as cursor:
                sql_tld_id_query = Database.query_stmt_list[0]+ ', '.join(selected_fields) + Database.query_stmt_list[4] + table + Database.query_stmt_list[5] + where_field + '=' + 'www.website.com'
                print("sql_tld_id_query is {}".format(sql_tld_id_query))
        except Exception as gatherid_err:
            print("exception was {}".format(gatherid_err))
            self.db.rollback()

I'm invoking it like:

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

我收到如下错误:

名称“表”未定义

完整追溯 调用方式:

import traceback
traceback.print_stack()

`

  File "dbcrud.py", line 56, in <module>
    dbclass.db_select('id', 'name', table='tld', where_field='name')
  File "dbcrud.py", line 31, in db_select
    traceback.print_stack()
self.selected_fields is ['id', 'name']
exception was name 'table' is not defined

我在这里做错了什么?

【问题讨论】:

  • 如果错误消息的微小 sn-p 来自 kwargs['table'],那么我无法重现您的错误。更多细节,请。
  • 我同意@JackManey:发布整个堆栈跟踪。
  • "name 'table' is not defined" 表示table 没有作为变量名找到,因此错误不能来自kwargs['table'](它会是一个KeyError)。看看你在代码中的什么地方使用了一个名为“table”的变量。
  • 你为什么使用traceback.print_stack?这里没用,也不显示错误信息。
  • @Jshee 如果您不知道如何复制和粘贴文本或堆栈跟踪是什么,那么我不确定我们能否为您提供帮助...

标签: python python-3.x python-3.5 keyword-argument


【解决方案1】:

我添加了续行以使其水平适合...

sql_tld_id_query = Database.query_stmt_list[0]+ ', '.join(selected_fields) + \
Database.query_stmt_list[4] + table + Database.query_stmt_list[5] + \
where_field + '=' + 'www.website.com'

粗体的table应该是self.table

你盲目地用tryexcept Exception块捕获所有异常,这可能对你隐藏了真正的问题。最好找出您要捕获的特定类型的异常,然后仅将其过滤掉。例如,如果我想让一个计算器程序在用户尝试除以零时不会崩溃,我会使用try: ... except ZeroDivisionError as e: ...

【讨论】:

  • 这就是为什么永远不要使用过于宽泛的“例外例外”子句。它不是处理预期的,而是隐藏意外的。
  • where_field 呢?
  • @Aaron 您可以将Database.query_stmt_list 放入变量中,而不是使其水平放置。
  • @Jshee vultah 关于where_field 可能是正确的,我看不出它在哪里被定义或设置为你的类的属性......
  • @Aaron 需要另一个 self.&lt;field&gt; - 再次感谢
猜你喜欢
  • 2018-10-15
  • 2018-02-15
  • 2020-10-09
  • 2021-05-11
  • 2015-06-17
  • 2018-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多