Skip to content

Commit 9ae40a2

Browse files
PrettyWoodsamuelcolvin
authored andcommitted
fix: set right default value for required (optional) fields (#2143)
closes #2142
1 parent 0d2b4d6 commit 9ae40a2

File tree

4 files changed

+33
-3
lines changed

4 files changed

+33
-3
lines changed

changes/2142-PrettyWood.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
fix: set right default value for required (optional) fields

pydantic/fields.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,7 @@ def infer(
307307
required: 'BoolUndefined' = Undefined
308308
if value is Required:
309309
required = True
310-
value = None
310+
value = Ellipsis
311311
elif value is not Undefined:
312312
required = False
313313
field_info.alias = field_info.alias or field_info_from_config.get('alias')

tests/test_dataclasses.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -406,7 +406,7 @@ class User:
406406
fields = user.__pydantic_model__.__fields__
407407

408408
assert fields['id'].required is True
409-
assert fields['id'].default is None
409+
assert fields['id'].default is Ellipsis
410410

411411
assert fields['name'].required is False
412412
assert fields['name'].default == 'John Doe'
@@ -425,7 +425,7 @@ class User:
425425
fields = user.__pydantic_model__.__fields__
426426

427427
assert fields['id'].required is True
428-
assert fields['id'].default is None
428+
assert fields['id'].default is Ellipsis
429429

430430
assert fields['aliases'].required is False
431431
assert fields['aliases'].default == {'John': 'Joey'}

tests/test_main.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -980,6 +980,35 @@ class Config:
980980
assert m.dict(exclude_unset=True, by_alias=True) == {'alias_a': 'a', 'c': 'c'}
981981

982982

983+
def test_exclude_defaults():
984+
class Model(BaseModel):
985+
mandatory: str
986+
nullable_mandatory: Optional[str] = ...
987+
facultative: str = 'x'
988+
nullable_facultative: Optional[str] = None
989+
990+
m = Model(mandatory='a', nullable_mandatory=None)
991+
assert m.dict(exclude_defaults=True) == {
992+
'mandatory': 'a',
993+
'nullable_mandatory': None,
994+
}
995+
996+
m = Model(mandatory='a', nullable_mandatory=None, facultative='y', nullable_facultative=None)
997+
assert m.dict(exclude_defaults=True) == {
998+
'mandatory': 'a',
999+
'nullable_mandatory': None,
1000+
'facultative': 'y',
1001+
}
1002+
1003+
m = Model(mandatory='a', nullable_mandatory=None, facultative='y', nullable_facultative='z')
1004+
assert m.dict(exclude_defaults=True) == {
1005+
'mandatory': 'a',
1006+
'nullable_mandatory': None,
1007+
'facultative': 'y',
1008+
'nullable_facultative': 'z',
1009+
}
1010+
1011+
9831012
def test_dir_fields():
9841013
class MyModel(BaseModel):
9851014
attribute_a: int

0 commit comments

Comments
 (0)