You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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函数内部,共有两处问题:

  1. 核心报错原因:cur.execute传入参数时,SQL语句字符串和后面的参数元组之间漏写了逗号。Python语法中,标识符后紧跟圆括号会被识别为可调用对象调用,这里字符串后直接跟(username, password),解释器会尝试把前面的SQL字符串当做可调用对象执行,而字符串本身不支持调用,因此抛出'str' object is not callable错误。
  2. 附带语法错误:函数最后一行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 23:36:27