Skip to content

Commit cb55780

Browse files
authored
Merge pull request #378 from kykosic/var-tuple
Fix variable length tuple codegen
2 parents cdbd28f + 50e43a1 commit cb55780

File tree

3 files changed

+20
-6
lines changed

3 files changed

+20
-6
lines changed

serde/de.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -791,8 +791,12 @@ def tuple(self, arg: DeField) -> str:
791791
maybe_generic=maybe_generic, maybe_generic_type_vars=maybe_generic_type_vars, \
792792
variable_type_args=None, reuse_instances=reuse_instances),)"
793793
"""
794-
if is_bare_tuple(arg.type) or is_variable_tuple(arg.type):
794+
if is_bare_tuple(arg.type):
795795
return f"tuple({arg.data})"
796+
elif is_variable_tuple(arg.type):
797+
earg = arg[0]
798+
earg.datavar = "v"
799+
return f"tuple({self.render(earg)} for v in {arg.data})"
796800
else:
797801
values = []
798802
for i, _typ in enumerate(type_args(arg.type)):

serde/se.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,16 @@
99
import functools
1010
import typing
1111
from dataclasses import dataclass, is_dataclass
12-
from typing import Any, Callable, Dict, Iterator, List, Optional, Tuple, Type, TypeVar, Generic
12+
from typing import Any, Callable, Dict, Generic, Iterator, List, Optional, Tuple, Type, TypeVar
1313

1414
import jinja2
1515
from typing_extensions import dataclass_transform
1616

1717
from .compat import (
18-
T,
1918
Literal,
2019
SerdeError,
2120
SerdeSkip,
21+
T,
2222
get_origin,
2323
is_any,
2424
is_bare_dict,
@@ -757,8 +757,12 @@ def tuple(self, arg: SeField) -> str:
757757
"""
758758
Render rvalue for tuple.
759759
"""
760-
if is_bare_tuple(arg.type) or is_variable_tuple(arg.type):
760+
if is_bare_tuple(arg.type):
761761
return arg.varname
762+
elif is_variable_tuple(arg.type):
763+
earg = arg[0]
764+
earg.name = "v"
765+
return f"tuple({self.render(earg)} for v in {arg.varname})"
762766
else:
763767
rvalues = []
764768
for i, _ in enumerate(type_args(arg.type)):

tests/test_basics.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -315,15 +315,21 @@ class Nested:
315315
)
316316
assert d == de(Nested, se(d))
317317

318+
@serde.serde(**opt)
319+
@dataclasses.dataclass
320+
class Inner:
321+
i: int
322+
318323
@serde.serde(**opt)
319324
@dataclasses.dataclass
320325
class VariableTuple:
321326
t: Tuple[int, ...]
327+
i: Tuple[Inner, ...]
322328

323-
e = VariableTuple((1, 2, 3))
329+
e = VariableTuple((1, 2, 3), (Inner(0), Inner(1)))
324330
assert e == de(VariableTuple, se(e))
325331

326-
e = VariableTuple(())
332+
e = VariableTuple((), ())
327333
assert e == de(VariableTuple, se(e))
328334

329335
with pytest.raises(Exception):

0 commit comments

Comments
 (0)