Python中访问字典键触发AttributeError,求排查解决
DataFrame验证代码的AttributeError错误排查
我编写了用于验证DataFrame的Python代码,目标是利用配置参数检查DataFrame的表头是否缺失、数据类型是否正确,但执行后出现AttributeError,无法定位错误原因,请求帮助排查。
代码实现
from pathlib import Path import pandas as pd df_settings = { "headers": [ "Header 1", "Header 2", "Header 3" ], "headers_type": { "Header 1": "int64", "Header 2": "object", "Header 3": "float" }, } class DataframeValidator: def __init__(self, df_data, df_settings): self.df_data = df_data self.df_settings = df_settings def _check_missing_headers(self): """检查是否存在必要的列头""" output_msg = "" missing_headers = [] standards_headers = self.df_settings['headers'] print(standards_headers) for header in standards_headers: if header in self.df_data.columns.tolist(): continue else: missing_headers.append(header) if missing_headers: output_msg = f"Missing headers check failed: missing headers have been detected:\n {missing_headers}" return (False, output_msg) else: output_msg = "Missing headers check passed: no missing headers have been detected." return(True, output_msg) def _check_wrong_types(self): """检查列数据类型是否符合要求""" print('_check_wrong_types') # 后续可补充类型检查逻辑 return (True, "Header type check passed.") def validate_data_frame(self): output_msg = "" # 直接映射配置项到实例方法 rules = { 'headers': self._check_missing_headers, 'headers_type': self._check_wrong_types } for setting in self.df_settings: if setting in rules: output = rules[setting]() output_msg += str(output) + "\n" print(output_msg) dataframe_path = Path('test.xlsx') dati = pd.read_excel(dataframe_path) validator = DataframeValidator(dati, df_settings) validator.validate_data_frame()
错误信息
File "/Users/manuelzompetta/Library/CloudStorage/OneDrive-Lactalis/_SPOOL OneDrive/Test/datavalidator3.py", line 30, in _check_missing_headers standards_headers = self.df_settings['headers'] ^^^^^^^^^^^^^^^^ AttributeError: 'list' object has no attribute 'df_settings'
错误原因分析
错误根源在于原代码中把实例方法_check_missing_headers直接作为类属性rules的值存储,在validate_data_frame中调用self.rules[setting](self.df_settings[setting])时,相当于直接调用了未绑定实例的函数:
- 此时传入的
self.df_settings[setting](比如headers对应的列表)被当成了函数的第一个参数self - 所以在
_check_missing_headers内部访问self.df_settings时,self实际是那个列表对象,自然不存在df_settings属性,触发AttributeError
修复方案
- 不在类级别定义
rules字典,而是在validate_data_frame方法内部动态绑定实例方法,确保调用时方法关联当前实例 - 调整方法调用方式,不再额外传递参数,让方法直接通过
self访问df_settings和df_data - 修正
_check_wrong_types的参数定义,移除不需要的**kwargs
修改后的代码已在上方给出,核心是将rules字典移到validate_data_frame内部,使用self._check_missing_headers这样的实例方法引用,调用时无需传递额外参数,方法内部直接通过self访问实例属性。
内容的提问来源于stack exchange,提问作者Manuel Zompetta
相关产品推荐
相关产品推荐

