如何修复UnboundLocalError: local variable 'par' referenced before assignment错误?
错误原因与修复方案
核心问题分析
触发UnboundLocalError的直接原因有三个:
- 未定义变量
hasil:POST代码块中par = hasil引用了从未声明的变量,直接导致赋值失败。 par未初始化:如果db_context为空(无匹配数据库记录),for循环不会执行,par变量从未被创建。- 表单初始化逻辑错误:无论请求类型是GET/POST,都用
request.POST初始化post_form,GET请求时会传入空数据导致表单异常。
分步修复
1. 修正表单初始化逻辑
避免GET请求时传入空POST数据,正确初始化表单:
post_form = MyForm(request.POST if request.method == 'POST' else None)
2. 安全初始化par变量
提前给par设置默认值,防止数据库无匹配时变量未定义;根据业务需求选择单条或拼接所有上下文:
# 初始化par为空字符串 par = "" # 拼接所有匹配的上下文(换行分隔) for con in db_context: par += con.context + "\n" # 若仅需第一条记录的上下文,可替换为: # if db_context.exists(): # par = db_context.first().context
3. 修复POST块的par赋值错误
删除无效的par = hasil,直接使用从数据库获取的par变量,同时增加空值校验避免无效请求:
if request.method == 'POST': question = request.POST.get('question', '') if question and par: # 确保问题和上下文都不为空 result = nlp(question=question, context=par) context['question'] = question context['answer'] = result['answer']
完整修复代码
def index(request): qas_form = QasForms() # 正确初始化表单 post_form = MyForm(request.POST if request.method == 'POST' else None) db_context = Context.objects.none() # 表单校验通过后再查询数据库 if post_form.is_valid(): db_context = Context.objects.filter(category=post_form.cleaned_data['category']) # 安全初始化par变量 par = "" for con in db_context: par += con.context + "\n" context = { 'heading': 'Question Answering', 'data_form': qas_form, 'form': post_form, 'Cont': db_context, } # 建议将模型加载移到模块级别,避免每次请求重复加载 model_name = BertForQuestionAnswering.from_pretrained('./save_model', from_tf=True) tokenizer = BertTokenizer.from_pretrained('./save_model') nlp = pipeline('question-answering', model=model_name, tokenizer=tokenizer) if request.method == 'POST': question = request.POST.get('question', '') if question and par: result = nlp(question=question, context=par) context['question'] = question context['answer'] = result['answer'] return render(request, 'qas/index.html', context)
额外优化建议
- 模型预加载:将模型和tokenizer的加载代码移到视图函数外(比如模块顶部),避免每次请求重复加载,大幅提升响应速度。
- 表单校验:新增
post_form.is_valid()校验,确保数据库查询使用合法的表单数据。 - 异常捕获:可给问答pipeline添加try-except块,处理模型调用时的异常情况。
内容的提问来源于stack exchange,提问作者Fortisen
相关产品推荐
相关产品推荐

