python 如何在pydantic中忽略字段repr?

rvpgvaaj  于 2023-06-04  发布在  Python
关注(0)|答案(2)|浏览(195)

当我想使用属性库忽略一些字段时,我可以使用repr=False选项。
但我在pydantic中找不到类似的选项
请参见示例代码

  1. import typing
  2. import attr
  3. from pydantic import BaseModel
  4. @attr.s(auto_attribs=True)
  5. class AttrTemp:
  6. foo: typing.Any
  7. boo: typing.Any = attr.ib(repr=False)
  8. class Temp(BaseModel):
  9. foo: typing.Any
  10. boo: typing.Any # I don't want to print
  11. class Config:
  12. frozen = True
  13. a = Temp(
  14. foo="test",
  15. boo="test",
  16. )
  17. b = AttrTemp(foo="test", boo="test")
  18. print(a) # foo='test' boo='test'
  19. print(b) # AttrTemp(foo='test')

但是,这并不意味着完全没有选项,我可以使用语法print(a.dict(exclude={"boo"}))
pydantic没有像repr=False这样的选项吗?

7y4bm7vi

7y4bm7vi1#

看起来这个特性已经在不久前实现了requestedalso
但是,它似乎还没有进入最新版本。
我看到两个选项如何启用该功能无论如何:

1.使用功能请求中提供的解决方法

定义一个helper类:

  1. import typing
  2. from pydantic import BaseModel, Field
  3. class ReducedRepresentation:
  4. def __repr_args__(self: BaseModel) -> "ReprArgs":
  5. return [
  6. (key, value)
  7. for key, value in self.__dict__.items()
  8. if self.__fields__[key].field_info.extra.get("repr", True)
  9. ]

并在Model定义中使用它:

  1. class Temp(ReducedRepresentation, BaseModel):
  2. foo: typing.Any
  3. boo: typing.Any = Field(..., repr=False)
  4. class Config:
  5. frozen = True
  6. a = Temp(
  7. foo="test",
  8. boo="test",
  9. )
  10. print(a)
  11. # foo='test'

2. pip install最新master

我建议在虚拟环境中这样做。这就是我的工作:
卸载现有版本:

  1. $ pip uninstall pydantic
  2. ...

安装最新的master

  1. $ pip install git+https://github.com/samuelcolvin/pydantic.git@master
  2. ...

之后,repr参数应该可以开箱即用:

  1. import typing
  2. from pydantic import BaseModel, Field
  3. class Temp(BaseModel):
  4. foo: typing.Any
  5. boo: typing.Any = Field(..., repr=False)
  6. class Config:
  7. frozen = True
  8. a = Temp(
  9. foo="test",
  10. boo="test",
  11. )
  12. print(a)
  13. # foo='test'
展开查看全部
xqkwcwgp

xqkwcwgp2#

现在已实施:

  1. import typing
  2. from pydantic import BaseModel, Field
  3. from pydantic.typing import Annotated
  4. class Temp(BaseModel):
  5. foo: typing.Any
  6. boo: Annotated[typing.Any, Field(repr=False)]

参见:https://docs.pydantic.dev/latest/usage/schema/#field-customization

相关问题