Skip to content

Commit 7d4c184

Browse files
committed
Add optimization for default on_setattr w/ no work to do
Otherwise we'd end up with an explicit setattr every time.
1 parent fedc570 commit 7d4c184

File tree

2 files changed

+16
-5
lines changed

2 files changed

+16
-5
lines changed

src/attr/_make.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@
5959
# Unique object for unequivocal getattr() defaults.
6060
_sentinel = object()
6161

62+
_ng_default_on_setattr = setters.pipe(setters.convert, setters.validate)
63+
6264

6365
class _Nothing(object):
6466
"""
@@ -722,13 +724,16 @@ def __init__(
722724
self._cls_dict["__delattr__"] = _frozen_delattrs
723725

724726
self._wrote_own_setattr = True
725-
elif on_setattr == setters.validate:
727+
elif on_setattr == _ng_default_on_setattr:
726728
for a in attrs:
727729
if a.validator is not None:
728730
break
731+
if a.converter is not None:
732+
break
729733
else:
730-
# If class-level on_setattr is set to validating, but there's
731-
# no field to validate, pretend like there's no on_setattr.
734+
# If class-level on_setattr is set to convert + validate, but
735+
# there's no field to convert or validate, pretend like there's
736+
# no on_setattr.
732737
self._on_setattr = None
733738

734739
if getstate_setstate:

src/attr/_next_gen.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,13 @@
88
from attr.exceptions import UnannotatedAttributeError
99

1010
from . import setters
11-
from ._make import NOTHING, _frozen_setattrs, attrib, attrs
11+
from ._make import (
12+
NOTHING,
13+
_frozen_setattrs,
14+
_ng_default_on_setattr,
15+
attrib,
16+
attrs,
17+
)
1218

1319

1420
def define(
@@ -92,7 +98,7 @@ def wrap(cls):
9298

9399
# By default, mutable classes convert & validate on setattr.
94100
if frozen is False and on_setattr is None:
95-
on_setattr = [setters.convert, setters.validate]
101+
on_setattr = _ng_default_on_setattr
96102

97103
# However, if we subclass a frozen class, we inherit the immutability
98104
# and disable on_setattr.

0 commit comments

Comments
 (0)