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

修复Python+Streamlit中color变量赋值前被引用的NameError报错

问题说明

Python项目对接SQL Server数据库做数据展示时,编写了针对Pandas DataFrame的行样式高亮函数,运行时程序崩溃,抛出错误:

NameError: free variable 'color' referenced before assignment in enclosing scope

涉及的原始核心代码如下:

import pyodbc 
import pandas as pd
import numpy as np
import streamlit as st

@st.experimental_singleton
def connect_db():
   con = pyodbc.connect(
       driver="ODBC Driver 17 for SQL Server",
       Server = "192.168.21.132",
       DATABASE="tasks",
       UID="xxxx",
       PWD="xxxx",
   )
   return con

def highlight_rows(row):
    value = row.loc["status_type"]
    if value == "done":
        color = "#ffffff"
    elif value == "pending":
        color = "#474d51"
    return [f'background-color: {color}' for _ in row]

con = connect_db()
df = pd.read_sql_query('select * from tasks.dbo.info',con)
st.dataframe(df.reset_index(drop=True).style.apply(highlight_rows,axis = 1),height = 500)
报错原因

highlight_rows函数内的color变量仅在status_type为done、pending两个分支中被赋值,一旦查询返回的数据集里存在其他状态值,两个条件分支都不命中,color变量没有被定义就被后续返回语句引用,最终触发作用域相关的NameError。

修复方法

核心修复逻辑:在条件判断前先给color变量设置默认兜底值,覆盖所有未匹配到预设状态的场景,从根源避免变量未定义问题。

修复后的样式函数代码:

def highlight_rows(row):
    value = row.loc["status_type"]
    # 提前设置默认背景色,兜底所有未明确配置样式的状态
    color = "#ffffff"
    if value == "done":
        color = "#ffffff"
    elif value == "pending":
        color = "#474d51"
    # 后续如果需要新增其他状态的样式,直接追加elif分支即可
    # elif value == "failed":
    #     color = "#ffcccc"
    return [f'background-color: {color}' for _ in row]

如果需要区分更多状态的展示样式,直接在条件判断中追加对应分支即可,只要保证所有分支逻辑执行完后color一定有确定值,就不会再触发同类报错。


内容的提问来源于stack exchange,提问作者DevLeb2022

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 20:54:19