Skip to content

Commit 8482d56

Browse files
committed
feat: handle default values for namedtuple params in decoder
1 parent 57f689e commit 8482d56

File tree

2 files changed

+9
-1
lines changed

2 files changed

+9
-1
lines changed

python/cocoindex/convert.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,10 +110,12 @@ def _make_engine_struct_value_decoder(
110110
if is_dataclass:
111111
parameters = inspect.signature(dst_struct_type).parameters
112112
elif is_namedtuple:
113+
defaults = getattr(dst_struct_type, '_field_defaults', {})
113114
parameters = {
114115
name: inspect.Parameter(
115116
name=name,
116117
kind=inspect.Parameter.POSITIONAL_OR_KEYWORD,
118+
default=defaults.get(name, inspect.Parameter.empty),
117119
annotation=dst_struct_type.__annotations__.get(name, inspect.Parameter.empty)
118120
)
119121
for name in dst_struct_type._fields
@@ -128,7 +130,7 @@ def make_closure_for_value(name: str, param: inspect.Parameter) -> Callable[[lis
128130
field_decoder = make_engine_value_decoder(
129131
field_path, src_fields[src_idx]['type'], param.annotation)
130132
field_path.pop()
131-
return lambda values: field_decoder(values[src_idx])
133+
return lambda values: field_decoder(values[src_idx]) if len(values) > src_idx else param.default
132134

133135
default_value = param.default
134136
if default_value is inspect.Parameter.empty:

python/cocoindex/tests/test_convert.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,12 @@ def test_make_engine_value_decoder_basic_types():
146146
# Extra field in engine value for Customer (should ignore)
147147
(Customer, ["Alice", ["O1", "item1", 10.0, "default_extra"], [["vip"]], "extra"], Customer("Alice", Order("O1", "item1", 10.0, "default_extra"), [Tag("vip")])),
148148
(CustomerNamedTuple, ["Alice", ["O1", "item1", 10.0, "default_extra"], [["vip"]], "extra"], CustomerNamedTuple("Alice", OrderNamedTuple("O1", "item1", 10.0, "default_extra"), [Tag("vip")])),
149+
# Missing optional field with default
150+
(Order, ["O123", "mixed nuts", 25.0], Order("O123", "mixed nuts", 25.0, "default_extra")),
151+
(OrderNamedTuple, ["O123", "mixed nuts", 25.0], OrderNamedTuple("O123", "mixed nuts", 25.0, "default_extra")),
152+
# Partial optional fields
153+
(Customer, ["Alice", ["O1", "item1", 10.0]], Customer("Alice", Order("O1", "item1", 10.0, "default_extra"), None)),
154+
(CustomerNamedTuple, ["Alice", ["O1", "item1", 10.0]], CustomerNamedTuple("Alice", OrderNamedTuple("O1", "item1", 10.0, "default_extra"), None)),
149155
]
150156
)
151157
def test_struct_decoder_cases(data_type, engine_val, expected):

0 commit comments

Comments
 (0)