Skip to content

Commit 2aaddf6

Browse files
authored
Deque's maxlen property dropped on V1 validation (#6586)
1 parent 15c82d9 commit 2aaddf6

File tree

3 files changed

+22
-2
lines changed

3 files changed

+22
-2
lines changed

changes/6581-maciekglowka.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fixes the `maxlen` property being dropped on `deque` validation. Happened only if the deque item has been typed. Changes the `_validate_sequence_like` func.

pydantic/fields.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -943,7 +943,7 @@ def _validate_sequence_like( # noqa: C901 (ignore complexity)
943943
elif self.shape == SHAPE_TUPLE_ELLIPSIS:
944944
converted = tuple(result)
945945
elif self.shape == SHAPE_DEQUE:
946-
converted = deque(result)
946+
converted = deque(result, maxlen=getattr(v, 'maxlen', None))
947947
elif self.shape == SHAPE_SEQUENCE:
948948
if isinstance(v, tuple):
949949
converted = tuple(result)
@@ -952,7 +952,7 @@ def _validate_sequence_like( # noqa: C901 (ignore complexity)
952952
elif isinstance(v, Generator):
953953
converted = iter(result)
954954
elif isinstance(v, deque):
955-
converted = deque(result)
955+
converted = deque(result, maxlen=getattr(v, 'maxlen', None))
956956
return converted, None
957957

958958
def _validate_iterable(

tests/test_types.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3123,6 +3123,25 @@ class Model(BaseModel):
31233123
assert Model(v=value).v == result
31243124

31253125

3126+
def test_deque_maxlen():
3127+
class DequeTypedModel(BaseModel):
3128+
field: Deque[int] = deque(maxlen=10)
3129+
3130+
assert DequeTypedModel(field=deque(maxlen=25)).field.maxlen == 25
3131+
assert DequeTypedModel().field.maxlen == 10
3132+
3133+
class DequeUnTypedModel(BaseModel):
3134+
field: deque = deque(maxlen=10)
3135+
3136+
assert DequeUnTypedModel(field=deque(maxlen=25)).field.maxlen == 25
3137+
assert DequeTypedModel().field.maxlen == 10
3138+
3139+
class DeuqueNoDefaultModel(BaseModel):
3140+
field: deque
3141+
3142+
assert DeuqueNoDefaultModel(field=deque(maxlen=25)).field.maxlen == 25
3143+
3144+
31263145
@pytest.mark.parametrize(
31273146
'cls,value,errors',
31283147
(

0 commit comments

Comments
 (0)