使用Pandera装饰器结合类函数时遇TypeError报错求助
解决Pandera check_io装饰器传入YAML字符串报错问题
问题重现
用户尝试在Python类中使用Pandera的check_io装饰器,操作流程如下:
- 定义
DataFrameSchema并保存为YAML文件 - 在类中读取YAML文件的文本内容,直接作为
check_io的参数 - 调用类方法时触发报错:
TypeError: type of out argument not recognized: <class 'str'>
错误原因
check_io装饰器要求传入的参数是Pandera Schema对象(如DataFrameSchema实例),但用户通过file.read()读取的是YAML格式的纯字符串,类型不匹配导致报错。
解决方案
读取YAML文件后,需要将字符串反序列化为DataFrameSchema对象,使用Pandera提供的from_yaml方法即可完成这一步骤。
修正后的代码示例
1. 保存Schema到YAML文件(优化版)
推荐使用Pandera自带的to_yaml方法,比直接用yaml.dump更可靠:
import pandera as pa from pandera import Column # 定义输入Schema in_schema = pa.DataFrameSchema( { "Name": Column(object, nullable=True), "Height": Column(object, nullable=True), } ) in_schema.to_yaml("./in_.yml") # 定义输出Schema out_schema = pa.DataFrameSchema( { "Name": Column(object, nullable=True), "Height": Column(object, nullable=True), } ) out_schema.to_yaml("./out_.yml")
2. 类定义与装饰器使用(修正版)
读取YAML时用from_yaml生成Schema对象:
import pandera as pa from pandera import check_io import pandas as pd class TransformClass(): # 读取YAML并反序列化为Schema对象 with open("./in_.yml", "r") as file: in_schema = pa.DataFrameSchema.from_yaml(file) with open("./out_.yml", "r") as file: out_schema = pa.DataFrameSchema.from_yaml(file) @staticmethod @check_io(df=in_schema, out=out_schema) def func(df: pd.DataFrame) -> pd.DataFrame: return df
3. 调用方法
from test import TransformClass import pandas as pd import numpy as np data = { 'Name': [np.nan, 'Princi', 'Gaurav', 'Anuj'], 'Height': [5.1, 6.2, 5.1, 5.2], 'Qualification': ['Msc', 'MA', 'Msc', 'Msc'] } df = pd.DataFrame(data) TransformClass.func(df)
额外说明
如果坚持使用原生yaml库加载,需要指定Pandera的YAML Loader来正确解析Schema对象,示例如下:
import yaml import pandera as pa with open("./in_.yml", "r") as file: in_schema = yaml.load(file, Loader=pa.io.yaml_loader.YamlLoader)
但仍推荐使用Pandera自带的from_yaml方法,减少兼容性问题。
内容的提问来源于stack exchange,提问作者illuminato
相关产品推荐
相关产品推荐

