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

如何在装饰器中传递其他函数的关键字参数并解决缩进错误

错误原因

你当前的代码存在两个层面的问题,直接触发语法报错:

  • Python语法规则要求,装饰器(也就是你写的@app.route('/home/reach_truck'))声明之后,必须紧跟缩进层级的被装饰对象定义(函数定义def xxx()或者类定义class xxx()),你在装饰器下方直接写裸的函数调用machines('Reach Truck'),完全不符合装饰器的语法要求,自然抛出缩进/语法错误。
  • Flask框架的路由逻辑要求,每个@app.route装饰器必须绑定一个可调用的处理函数,用户访问对应URL时,Flask才会调用该函数生成响应。你直接在装饰器下写函数调用,既没有完成路由和处理逻辑的绑定,代码还会在Flask应用启动阶段就执行一次,而非用户访问时执行,完全不符合接口运行逻辑。
修复方案

基础修复:路由函数内调用自定义逻辑

最直接的改法是补全路由对应的处理函数,在处理函数内部调用你写好的machines方法并传入指定参数:

import numpy as np
from flask import Flask, render_template

app = Flask(__name__)

# 原有统计逻辑无需改动
def machines(machine_name):  
  rb = np.array(machines_file.loc[machines_file['Machine'].str.contains(machine_name), 'Resolved By'])
  rb_o = np.count_nonzero(rb == 'Outsource')
  rb_ih = np.count_nonzero(rb == 'In-House')
  return render_template('reachtruck.html', outsource=rb_o, inhouse=rb_ih)

# 装饰器下紧跟路由处理函数定义
@app.route('/home/reach_truck')
def reach_truck_page():
    # 在处理函数内调用统计逻辑,传入目标参数
    return machines('Reach Truck')

if __name__ == '__main__':
    app.run()

复用优化:路由默认参数适配多场景

如果你后续需要新增其他设备类型的统计页面,不需要为每个设备单独写一个路由函数,可以通过路由的defaults参数传入默认值,复用同一套逻辑:

# 通用统计逻辑
def machines(machine_name):  
  rb = np.array(machines_file.loc[machines_file['Machine'].str.contains(machine_name), 'Resolved By'])
  rb_o = np.count_nonzero(rb == 'Outsource')
  rb_ih = np.count_nonzero(rb == 'In-House')
  # 建议把模板也改成通用模板,减少重复文件
  return render_template('machine_stats.html', outsource=rb_o, inhouse=rb_ih, current_machine=machine_name)

# 多个路由可以绑定同一个处理函数,通过defaults传入不同的设备名
@app.route('/home/reach_truck', defaults={'machine_name': 'Reach Truck'})
@app.route('/home/forklift', defaults={'machine_name': 'Forklift'})
def machine_stats_page(machine_name):
    return machines(machine_name)
注意事项
  • 任何装饰器下方都不能直接写函数调用、变量赋值这类执行语句,必须紧跟被装饰的函数/类定义,否则必然触发语法错误。
  • 写在装饰器下方、函数外部的代码会在应用启动时全局执行一次,不会在用户每次请求时触发,不要把请求相关的业务逻辑写在这个位置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 23:03:54