Skip to content

Commit 1341d19

Browse files
committed
Apply attrs' converter to default before omit_if_default check
1 parent 2ec13dd commit 1341d19

File tree

1 file changed

+17
-6
lines changed

1 file changed

+17
-6
lines changed

src/cattrs/gen/__init__.py

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from collections.abc import Callable, Iterable, Mapping
55
from typing import TYPE_CHECKING, Any, Final, Literal, TypeVar
66

7-
from attrs import NOTHING, Attribute, Factory
7+
from attrs import NOTHING, Attribute, Factory, Converter
88
from typing_extensions import NoDefault
99

1010
from .._compat import (
@@ -178,15 +178,26 @@ def make_dict_unstructure_fn_from_attrs(
178178
globs[def_name] = d.factory
179179
internal_arg_parts[def_name] = d.factory
180180
if d.takes_self:
181-
lines.append(f" if instance.{attr_name} != {def_name}(instance):")
181+
def_str = f"{def_name}(instance)"
182182
else:
183-
lines.append(f" if instance.{attr_name} != {def_name}():")
184-
lines.append(f" res['{kn}'] = {invoke}")
183+
def_str = f"{def_name}()"
185184
else:
186185
globs[def_name] = d
187186
internal_arg_parts[def_name] = d
188-
lines.append(f" if instance.{attr_name} != {def_name}:")
189-
lines.append(f" res['{kn}'] = {invoke}")
187+
def_str = def_name
188+
189+
c = a.converter
190+
if isinstance(c, Converter):
191+
conv_name = f"__c_conv_{attr_name}"
192+
globs[conv_name] = c
193+
internal_arg_parts[conv_name] = c
194+
field_name = f"__c_field_{attr_name}"
195+
globs[field_name] = a
196+
internal_arg_parts[field_name] = a
197+
def_str = f"{conv_name}({def_str}, instance, {field_name})"
198+
199+
lines.append(f" if instance.{attr_name} != {def_str}:")
200+
lines.append(f" res['{kn}'] = {invoke}")
190201

191202
else:
192203
# No default or no override.

0 commit comments

Comments
 (0)