|
4 | 4 | from collections.abc import Callable, Iterable, Mapping |
5 | 5 | from typing import TYPE_CHECKING, Any, Final, Literal, TypeVar |
6 | 6 |
|
7 | | -from attrs import NOTHING, Attribute, Factory |
| 7 | +from attrs import NOTHING, Attribute, Factory, Converter |
8 | 8 | from typing_extensions import NoDefault |
9 | 9 |
|
10 | 10 | from .._compat import ( |
@@ -178,15 +178,26 @@ def make_dict_unstructure_fn_from_attrs( |
178 | 178 | globs[def_name] = d.factory |
179 | 179 | internal_arg_parts[def_name] = d.factory |
180 | 180 | if d.takes_self: |
181 | | - lines.append(f" if instance.{attr_name} != {def_name}(instance):") |
| 181 | + def_str = f"{def_name}(instance)" |
182 | 182 | else: |
183 | | - lines.append(f" if instance.{attr_name} != {def_name}():") |
184 | | - lines.append(f" res['{kn}'] = {invoke}") |
| 183 | + def_str = f"{def_name}()" |
185 | 184 | else: |
186 | 185 | globs[def_name] = d |
187 | 186 | 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}") |
190 | 201 |
|
191 | 202 | else: |
192 | 203 | # No default or no override. |
|
0 commit comments