Python装饰器中nonlocal关键字的作用及是否启用的疑问
关于装饰器中
nonlocal file_name的作用与取舍 先搞懂nonlocal的通用作用
nonlocal是Python专门用来声明变量来自外层嵌套函数作用域的关键字,和global对应(global管的是全局作用域的变量)。直白点说:
- 要是你在嵌套函数里只想读取外层函数的变量,不用
nonlocal也能正常拿到; - 但要是你想在嵌套函数里修改外层函数的变量,必须加
nonlocal声明,不然Python会把这个变量当成嵌套函数的局部变量,直接抛出"局部变量未赋值就引用"的错误。
你的场景为啥注释掉还能跑
从你的两种使用方式来看:
- 装饰器语法调用:
@save_to_csv装饰带file_name参数的函数 - 直接调用带参数的装饰器:
save_data_to_csv = save_to_cvs(dir, f"{bus_name}")(self.calculate_worse_case)
当前你的代码里,应该只是在嵌套的装饰器函数中读取外层的file_name变量(比如用来打开文件写入),没有对它做赋值修改操作。这种情况下,Python会自动向上查找作用域找到这个变量,所以注释掉nonlocal也能正常运行。
要不要取消注释(即加回nonlocal)
分两种情况判断:
- 如果你的代码逻辑永远不会修改外层的
file_name,只是读取,那加不加都能跑,但加nonlocal是更规范的写法——能明确告诉看代码的人:这个变量不是当前函数的局部变量,来自外层嵌套作用域,可读性更强,也能避免后续修改代码时踩坑。 - 如果以后你可能要动态修改这个
file_name(比如拼接路径、根据函数返回值调整文件名),那必须加nonlocal,不然修改时会直接报错。
内容的提问来源于stack exchange,提问作者Ruan Carlo Weiers Britzke
相关产品推荐
相关产品推荐

