Python报TypeError: 'str' object is not callable错误排查(未用str命名)
问题描述
编写Flask路由逻辑时,执行exists = db.get_passdetails(username,password)代码行触发TypeError: 'str' object is not callable报错,已确认代码中未使用str作为变量或函数名,无法定位故障原因。
涉及的路由功能代码如下:
@app.route('/passwordLoginForm1', methods=['GET','POST']) def passwordLoginForm1(): username = request.form['username'] password = request.form['password'] exists = db.get_passdetails(username,password) if exists == 'true': return render_template('pin.html') else: return render_template('passwordsLogin2.html')
被调用的get_passdetails数据库查询方法实现如下:
def get_passdetails(username,password): cur=conn.cursor() cur.execute("SELECT * FROM Password WHERE username = %s AND password = %s" (username, password)) details = cur.fetchone() if details: return 'true' else: return 'false
故障根因
报错的真实触发点不在路由调用行,而在get_passdetails函数内部,共有两处问题:
- 核心报错原因:
cur.execute传入参数时,SQL语句字符串和后面的参数元组之间漏写了逗号。Python语法中,标识符后紧跟圆括号会被识别为可调用对象调用,这里字符串后直接跟(username, password),解释器会尝试把前面的SQL字符串当做可调用对象执行,而字符串本身不支持调用,因此抛出'str' object is not callable错误。 - 附带语法错误:函数最后一行
return 'false漏写了字符串闭合的单引号,就算修复逗号问题,这行也会触发语法解析报错。
修复方案
修正get_passdetails函数的两处错误,修正后的代码如下:
def get_passdetails(username,password): cur=conn.cursor() # SQL字符串与参数元组之间补充逗号,作为execute方法的第二个入参 cur.execute("SELECT * FROM Password WHERE username = %s AND password = %s", (username, password)) details = cur.fetchone() if details: return 'true' else: return 'false'
排查提示
- 遇到「X object is not callable」类报错时,不要只局限于报错提示指向的代码行,要顺着调用栈检查所有被调用的内部代码,很多时候错误出现在调用链的深层位置。
- 使用数据库驱动的参数化查询时,
execute方法要求第一个入参为SQL语句模板,第二个入参为参数序列/元组,两个入参之间必须用逗号分隔。 - 编写字符串、括号类成对语法时,建议写完左符号立刻补全右符号,再填充中间内容,避免漏写闭合符号的低级错误。
内容的提问来源于stack exchange,提问作者oreillsf
相关产品推荐
相关产品推荐

