Python运行函数报NameError: final_error_code未定义如何解决
问题产生原因
- 变量赋值位置存在逻辑漏洞:
final_error_code的赋值语句写在两层嵌套循环的最内层,只有当外层文件遍历循环执行、且内层正则匹配到PT-内容时,这个变量才会被创建。如果files列表为空、或者所有文件内容都没有匹配到目标字符串,两层循环都不会进入赋值逻辑,执行到循环外的打印、返回语句时,final_error_code根本没有被定义,就会触发NameError。 - 注释掉的
global final_error_code无法解决问题:全局声明只是指定变量的作用域来源,不会自动给变量赋初始值。如果没有任何代码执行过给final_error_code赋值的操作,哪怕声明了全局变量,访问时依然会报未定义错误。 - 附带的逻辑bug:代码中打开文件用了
w+模式,该模式会在打开文件时直接清空原有文件内容,后续readlines()根本读不到原文件的真实数据,大概率会导致正则完全匹配不到结果,进一步触发变量未定义的问题。
修复方案
- 在函数内部、进入循环前提前初始化
final_error_code变量,保证无论循环是否执行、是否匹配到结果,变量都有合法的初始值,不需要使用全局变量。 - 将文件打开模式从
w+改为r只读模式,避免打开文件时清空原内容。 - 优化冗余逻辑:原代码每次匹配到一个结果就重新生成整个
final_error_code列表属于不必要的性能损耗,可以把列表生成逻辑挪到所有遍历、匹配操作完成后再执行。 - 增加索引边界判断,避免匹配到的
PT-位于字符串末尾时触发索引越界错误。
修复后的完整代码如下:
import re import json def get_error_code_array(): array_pt_failed_current = [] # 提前初始化目标变量 final_error_code = [] for file_path in files: # 读文件使用r只读模式,指定编码避免乱码 with open(file_path, 'r', encoding='utf-8') as f: lines = f.readlines() error_str = json.dumps(lines) print("This is get error code of ", error_str) for pt_found in re.finditer(r'PT-', error_str): start_idx = pt_found.end() # 边界判断,防止索引超出字符串长度 if start_idx + 2 >= len(error_str): continue # 提取PT-后的三位错误码 pt_failed_current = error_str[start_idx] + error_str[start_idx+1] + error_str[start_idx+2] array_pt_failed_current.append(pt_failed_current) # 所有匹配完成后统一生成最终错误码列表 final_error_code = [f"PT-{code}" for code in array_pt_failed_current] print("Lemon Squeeze", final_error_code) return final_error_code
内容的提问来源于stack exchange,提问作者uds
相关产品推荐
相关产品推荐

