diff --git a/changes/3234-cocolman.md b/changes/3234-cocolman.md new file mode 100644 index 0000000000..b7f9cad68f --- /dev/null +++ b/changes/3234-cocolman.md @@ -0,0 +1 @@ +Fix display of `extra` fields with model `__repr__` diff --git a/pydantic/main.py b/pydantic/main.py index 99d97008b1..fa501701f7 100644 --- a/pydantic/main.py +++ b/pydantic/main.py @@ -873,7 +873,9 @@ def __eq__(self, other: Any) -> bool: return self.dict() == other def __repr_args__(self) -> 'ReprArgs': - return [(k, v) for k, v in self.__dict__.items() if self.__fields__[k].field_info.repr] + return [ + (k, v) for k, v in self.__dict__.items() if k not in self.__fields__ or self.__fields__[k].field_info.repr + ] _is_base_model_class_defined = True diff --git a/tests/test_main.py b/tests/test_main.py index 688cca127d..71da72544b 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -208,6 +208,16 @@ class Config: assert Model(a='10.2', b=12).dict() == {'a': 10.2, 'b': 12} +def test_allow_extra_repr(): + class Model(BaseModel): + a: float = ... + + class Config: + extra = Extra.allow + + assert str(Model(a='10.2', b=12)) == 'a=10.2 b=12' + + def test_forbidden_extra_success(): class ForbiddenExtra(BaseModel): foo = 'whatever'