Skip to content

Commit dbb9729

Browse files
authored
Don't swallow TypeErrors raised by _bind_to_schema or on_bind_field (#1376)
1 parent 0549bd4 commit dbb9729

3 files changed

Lines changed: 25 additions & 6 deletions

File tree

CHANGELOG.rst

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
Changelog
22
---------
33

4+
2.20.3 (unreleased)
5+
*******************
6+
7+
Bug fixes:
8+
9+
- Don't swallow ``TypeError`` exceptions raised by ``Field._bind_to_schema`` or ``Schema.on_bind_field``.
10+
411
2.20.2 (2019-08-20)
512
*******************
613

src/marshmallow/schema.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -786,14 +786,13 @@ def __set_field_attrs(self, fields_dict):
786786
specified in ``class Meta``.
787787
"""
788788
for field_name, field_obj in iteritems(fields_dict):
789+
if field_name in self.load_only:
790+
field_obj.load_only = True
791+
if field_name in self.dump_only:
792+
field_obj.dump_only = True
789793
try:
790-
if field_name in self.load_only:
791-
field_obj.load_only = True
792-
if field_name in self.dump_only:
793-
field_obj.dump_only = True
794794
field_obj._add_to_schema(field_name, self)
795-
self.on_bind_field(field_name, field_obj)
796-
except TypeError:
795+
except TypeError as error:
797796
# field declared as a class, not an instance
798797
if (isinstance(field_obj, type) and
799798
issubclass(field_obj, base.FieldABC)):
@@ -802,6 +801,8 @@ def __set_field_attrs(self, fields_dict):
802801
'Did you mean "fields.{1}()"?'
803802
.format(field_name, field_obj.__name__))
804803
raise TypeError(msg)
804+
raise error
805+
self.on_bind_field(field_name, field_obj)
805806
return fields_dict
806807

807808
def __filter_fields(self, field_names, obj, many=False):

tests/test_schema.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -552,6 +552,17 @@ class BadUserSchema(Schema):
552552
with pytest.raises(TypeError, match='must be declared as a Field instance'):
553553
BadUserSchema().dump(user)
554554

555+
# regression test
556+
def test_bind_field_does_not_swallow_typeerror():
557+
class MySchema(Schema):
558+
name = fields.Str()
559+
560+
def on_bind_field(self, field_name, field_obj):
561+
raise TypeError("boom")
562+
563+
with pytest.raises(TypeError, match="boom"):
564+
MySchema()
565+
555566
@pytest.mark.parametrize('SchemaClass',
556567
[UserSchema, UserMetaSchema])
557568
def test_serializing_generator(SchemaClass):

0 commit comments

Comments
 (0)