修复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
相关产品推荐
相关产品推荐

