pydantic v2.0.0 带有 pylint 无成员警告

黄振宇*_*黄振宇 5 python types pylint python-3.x pydantic

问题

  • pydantic doc中,pydantic ^2.0.0 不支持这样a:Optional[str],而是支持a:Optional[str] = Field(default=None)
  • 但是,pylint 检查我的代码会引发警告[E1101(no-member), get] Instance of 'FieldInfo' has no 'split' member
from pydantic import BaseModel, Field
from typing import Optional


class A(BaseModel):
    a: Optional[str] = Field(default=None)


def get(**kwargs):
    return A(**kwargs).a.split(" ")
Run Code Online (Sandbox Code Playgroud)

试图

  • 如果我使用a:Optional[str] = None可以解决上述所有问题,但是我的项目某些字段使用 Field
  • 声明 pylint 禁用 pyfile 中的检查:pylint: disable=no-member
  • 声明 pylint 禁用检查 .pylinrc

我该如何解决上述问题

Gus*_*oto 0

您还可以Annotated使用 pydantic 来装饰您的字段Field。像这样的东西应该适合你:

from pydantic import BaseModel, Field
from typing import Annotated, Optional


class A(BaseModel):
    a: Annotated[Optional[str], Field(default=None)]


def get(**kwargs):
    return A(**kwargs).a.split(" ")
Run Code Online (Sandbox Code Playgroud)

它失败的原因是 pylint 如何分析像这样的静态属性,使用 的Field结果作为值而不是我们提供的类型提示。

Field这也适用于其他属性:

from enum import Enum
from typing import Annotated, Any, Optional

from pydantic import BaseModel, Field


class Kind(Enum):
    ABC = "abc"


class MyClass(BaseModel):
    kind: Annotated[Optional[Kind], Field(default=None, alias="Kind")]


args: dict[str, Any] = {"Kind": "abc"}

obj = MyClass(**args)

print(obj.kind)  # Kind.ABC
Run Code Online (Sandbox Code Playgroud)