如何使用getattr将字符串作为属性调用?解决TypeError报错
解决代码中的TypeError并简化循环逻辑
咱们先来看你碰到的问题:TypeError: 'str' object is not callable,这个错误的根源在get_stat函数里的stat()这一行——你把字符串类型的stat(比如'max'、'min')当成可调用的函数来执行了,自然会触发报错。
错误原因拆解
原代码里的return getattr(df['close'], stat()),getattr的第二个参数只需要传入属性名的字符串就行,不需要给字符串加括号调用(只有函数才能这么做),这就是问题的核心。
修正后的完整代码
我们先把错误的地方改掉,同时优化循环的打印逻辑,让输出更直观:
import pandas as pd def test_run(): # 遍历每个目标文件 for symbol in ['nugt', 'soxs']: print(f"\n--- {symbol} 的close列统计 ---") # 遍历需要计算的统计量 for stat in ['max', 'min', 'mean']: result = get_stat(symbol, stat) print(f"{stat.title()} Close: {result:.2f}") def get_stat(symbol, stat): df = pd.read_csv(f"{symbol}.csv") # 直接传入stat字符串,不需要加括号调用 return getattr(df['close'], stat)() if __name__ == "__main__": test_run()
进一步简化代码的方案
如果想让代码更紧凑,其实可以去掉单独的get_stat函数,直接在循环里完成逻辑,同样能保持代码的简洁性:
import pandas as pd def test_run(): stats = ['max', 'min', 'mean'] for symbol in ['nugt', 'soxs']: df = pd.read_csv(f"{symbol}.csv") print(f"\n--- {symbol} close列统计结果 ---") for stat in stats: value = getattr(df['close'], stat)() print(f"{stat.title()}: {value:.2f}") if __name__ == "__main__": test_run()
这样既解决了报错问题,又实现了你用循环简化代码的需求,输出结果也更易读。
内容的提问来源于stack exchange,提问作者EMZ
相关产品推荐
相关产品推荐

