“pydantic\validators.py”:找不到 <class 'pandas.core.frame.DataFrame'> 的验证器

use*_*009 32 validation customvalidator pandas python-dataclasses pydantic

以下 pandas 的 DataFrame 未经过 pydantic 验证。这要怎么处理呢?

from pydantic.dataclasses import dataclass

@dataclass
class DataFrames:
    dataframe1: pd.DataFrame = None
    dataframe2: pd.DataFrame = None
Run Code Online (Sandbox Code Playgroud)

这会引发以下错误:

File "pydantic\validators.py", line 715, in find_validators

RuntimeError: no validator found for <class 'pandas.core.frame.DataFrame'>, see `arbitrary_types_allowed` in Config
Run Code Online (Sandbox Code Playgroud)

Kar*_*nga 57

就我个人而言,我输错了类型注释

class Foo(BaseModel):
    bar = Optional[NonNegativeInt]
Run Code Online (Sandbox Code Playgroud)

而不是;

class Foo(BaseModel):
    bar: Optional[NonNegativeInt]
Run Code Online (Sandbox Code Playgroud)

愚蠢的一个,但请仔细检查:)

  • 这没有回答问题 (21认同)
  • 同意@zaffer。不直接。但显然人们发现它很有用。 (6认同)

pjm*_*jmv 22

根据Pydantic 文档,您可以通过多种方式解决您的问题。

最简单的一种是在模型配置中允许任意类型,但这是用以下内容打包的功能:再次BaseModel引用文档:

请记住,pydantic.dataclasses.dataclass 是带有验证的 dataclasses.dataclass 的直接替代品,而不是 pydantic.BaseModel 的替代品

考虑到这一点,以下代码运行良好:

import pandas as pd
from pydantic import BaseModel

class DataFrames(BaseModel):
    dataframe1: pd.DataFrame = None
    dataframe2: pd.DataFrame = None

    class Config:
        arbitrary_types_allowed = True
Run Code Online (Sandbox Code Playgroud)


pav*_*roo 18

如果您来到这里遇到一般问题,no validator found for <class 'XYZ'>您应该检查错过的 BaseModel 继承:

from pydantic import BaseModel

class MyCustomType: # We forgot inheritance here, should be MyCustomType(BaseModel)
    id: int
    text: str

class MyCustomClass2(BaseModel):
    data: List[MyCustomType]
Run Code Online (Sandbox Code Playgroud)