如何让Python报错信息显示引发错误的__init__()所在文件位置
__init__()的文件位置,以及修复参数错误 首先,咱们先解决你最关心的让报错显示__init__()所在文件位置的问题,再处理根源的参数错误。
一、让Python打印完整的错误调用栈
你当前看到的traceback只显示到自己的nn_script.py第55行,是因为默认traceback可能没有展开深层调用。可以通过两种方式让它显示完整的栈信息:
方法1:在代码中添加异常捕获,手动打印完整栈
在你调用ImageDataGenerator的代码块周围包裹try-except,用traceback模块打印全部错误信息:
import traceback from tensorflow.keras.preprocessing.image import ImageDataGenerator # 假设这是你原来第55行附近的代码 try: datagen = ImageDataGenerator(zca_whitening_fast=True) # 你的调用代码 except TypeError as e: print("完整错误追踪信息:") traceback.print_exc()
运行后,你会看到包含__init__()方法所在文件和行号的完整调用栈,直接定位到那个类的定义位置。
方法2:取消Python的traceback显示限制
有时候Python会截断过长的traceback,你可以在代码开头添加一行,取消限制:
import sys sys.tracebacklimit = 0 # 0表示不限制,显示所有层级的调用
再运行脚本,就能看到完整的错误栈了。
二、修复unexpected keyword argument的根源问题
从你的描述来看,你修改了keras_preprocessing和keras下的文件,但你导入的是tensorflow.keras.preprocessing.image.ImageDataGenerator——这个类其实是属于TensorFlow内置的Keras实现,和你修改的那两个文件不是同一个!
步骤1:找到真正的ImageDataGenerator文件路径
先在代码里打印这个类的实际位置:
from tensorflow.keras.preprocessing.image import ImageDataGenerator print("类所在模块:", ImageDataGenerator.__module__) print("类所在文件:", ImageDataGenerator.__file__)
运行后会输出类似这样的路径:
类所在模块: tensorflow.python.keras.preprocessing.image 类所在文件: /home/user/.local/lib/python3.6/site-packages/tensorflow/python/keras/preprocessing/image.py
你需要去修改这个文件里的ImageDataGenerator的__init__()方法,添加zca_whitening_fast参数和对应的处理逻辑。
步骤2:更稳妥的替代方案(不修改库源代码)
直接修改第三方库的源代码不是好习惯——后续更新库时你的修改会被覆盖,而且容易引发其他问题。建议你**继承原类,重写__init__**来添加自定义参数:
from tensorflow.keras.preprocessing.image import ImageDataGenerator class CustomImageDataGenerator(ImageDataGenerator): def __init__(self, zca_whitening_fast=False, **kwargs): # 先调用父类的初始化方法 super().__init__(**kwargs) # 添加你的自定义参数 self.zca_whitening_fast = zca_whitening_fast # 这里可以添加你需要的额外逻辑,比如基于这个参数的处理 # 之后用自定义类代替原类 datagen = CustomImageDataGenerator(zca_whitening_fast=True)
这样既实现了你的需求,又不会破坏原库的代码。
内容的提问来源于stack exchange,提问作者NeStack

