pythonpython-3.xpydanticpython-attrs

How to ignore field repr in pydantic?


When I want to ignore some fields using attr library, I can use repr=False option.
But I cloud't find a similar option in pydantic

Please see example code

import typing
import attr

from pydantic import BaseModel


@attr.s(auto_attribs=True)
class AttrTemp:
    foo: typing.Any
    boo: typing.Any = attr.ib(repr=False)


class Temp(BaseModel):
    foo: typing.Any
    boo: typing.Any  # I don't want to print

    class Config:
        frozen = True


a = Temp(
    foo="test",
    boo="test",
)
b = AttrTemp(foo="test", boo="test")
print(a)  # foo='test' boo='test'
print(b)  # AttrTemp(foo='test')

However, it does not mean that there are no options at all, I can use the syntax print(a.dict(exclude={"boo"}))

Doesn't pydantic have an option like repr=False?


Solution

  • It looks like this feature has been requested and also implemented not long ago.

    However, it seems like it hasn't made it into the latest release yet.

    I see two options how to enable the feature anyway:

    1. Use the workaround provided in the feature request

    Define a helper class:

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

    and use it in your Model definition:

    class Temp(ReducedRepresentation, BaseModel):
        foo: typing.Any
        boo: typing.Any = Field(..., repr=False)
    
        class Config:
            frozen = True
    
    a = Temp(
        foo="test",
        boo="test",
    )
    print(a) 
    # foo='test'
    

    2. pip install the latest master

    I would suggest doing this in a virtual environment. This is what worked for me:

    Uninstall the existing version:

    $ pip uninstall pydantic
    ...
    

    Install latest master:

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

    After that the repr argument should work out of the box:

    import typing
    from pydantic import BaseModel, Field
    
    class Temp(BaseModel):
        foo: typing.Any
        boo: typing.Any = Field(..., repr=False)
    
        class Config:
            frozen = True
    
    a = Temp(
        foo="test",
        boo="test",
    )
    print(a) 
    # foo='test'