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

如何修复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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 01:29:57