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

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

修复方案

  1. 不在类级别定义rules字典,而是在validate_data_frame方法内部动态绑定实例方法,确保调用时方法关联当前实例
  2. 调整方法调用方式,不再额外传递参数,让方法直接通过self访问df_settings和df_data
  3. 修正_check_wrong_types的参数定义,移除不需要的**kwargs

修改后的代码已在上方给出,核心是将rules字典移到validate_data_frame内部,使用self._check_missing_headers这样的实例方法引用,调用时无需传递额外参数,方法内部直接通过self访问实例属性。

内容的提问来源于stack exchange,提问作者Manuel Zompetta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 05:35:15