Skip to content

Commit cb825ff

Browse files
committed
Split sequence into tuple and list in Python.
1 parent c4ba359 commit cb825ff

File tree

4 files changed

+52
-17
lines changed

4 files changed

+52
-17
lines changed

hugr-py/src/hugr/_serialization/tys.py

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -158,12 +158,20 @@ def deserialize(self) -> tys.StringArg:
158158
return tys.StringArg(value=self.arg)
159159

160160

161-
class SequenceArg(BaseTypeArg):
162-
tya: Literal["Sequence"] = "Sequence"
161+
class ListArg(BaseTypeArg):
162+
tya: Literal["List"] = "List"
163163
elems: list[TypeArg]
164164

165-
def deserialize(self) -> tys.SequenceArg:
166-
return tys.SequenceArg(elems=deser_it(self.elems))
165+
def deserialize(self) -> tys.ListArg:
166+
return tys.ListArg(elems=deser_it(self.elems))
167+
168+
169+
class TupleArg(BaseTypeArg):
170+
tya: Literal["Tuple"] = "Tuple"
171+
elems: list[TypeArg]
172+
173+
def deserialize(self) -> tys.TupleArg:
174+
return tys.TupleArg(elems=deser_it(self.elems))
167175

168176

169177
class VariableArg(BaseTypeArg):
@@ -179,7 +187,12 @@ class TypeArg(RootModel):
179187
"""A type argument."""
180188

181189
root: Annotated[
182-
TypeTypeArg | BoundedNatArg | StringArg | SequenceArg | VariableArg,
190+
TypeTypeArg
191+
| BoundedNatArg
192+
| StringArg
193+
| ListArg
194+
| TupleArg
195+
| VariableArg,
183196
WrapValidator(_json_custom_error_validator),
184197
] = Field(discriminator="tya")
185198

hugr-py/src/hugr/ops.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -534,7 +534,7 @@ def cached_signature(self) -> tys.FunctionType | None:
534534
)
535535

536536
def type_args(self) -> list[tys.TypeArg]:
537-
return [tys.SequenceArg([t.type_arg() for t in self.types])]
537+
return [tys.ListArg([t.type_arg() for t in self.types])]
538538

539539
def __call__(self, *elements: ComWire) -> Command:
540540
return super().__call__(*elements)
@@ -576,7 +576,7 @@ def cached_signature(self) -> tys.FunctionType | None:
576576
)
577577

578578
def type_args(self) -> list[tys.TypeArg]:
579-
return [tys.SequenceArg([t.type_arg() for t in self.types])]
579+
return [tys.ListArg([t.type_arg() for t in self.types])]
580580

581581
@property
582582
def num_out(self) -> int:

hugr-py/src/hugr/tys.py

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -245,26 +245,43 @@ def to_model(self) -> model.Term:
245245

246246

247247
@dataclass(frozen=True)
248-
class SequenceArg(TypeArg):
249-
"""Sequence of type arguments, for a :class:`ListParam` or :class:`TupleParam`."""
248+
class ListArg(TypeArg):
249+
"""Sequence of type arguments for a :class:`ListParam`."""
250250

251251
elems: list[TypeArg]
252252

253-
def _to_serial(self) -> stys.SequenceArg:
254-
return stys.SequenceArg(elems=ser_it(self.elems))
253+
def _to_serial(self) -> stys.ListArg:
254+
return stys.ListArg(elems=ser_it(self.elems))
255255

256256
def resolve(self, registry: ext.ExtensionRegistry) -> TypeArg:
257-
return SequenceArg([arg.resolve(registry) for arg in self.elems])
257+
return ListArg([arg.resolve(registry) for arg in self.elems])
258258

259259
def __str__(self) -> str:
260-
return f"({comma_sep_str(self.elems)})"
260+
return f"[{comma_sep_str(self.elems)}]"
261261

262262
def to_model(self) -> model.Term:
263-
# TODO: We should separate lists and tuples.
264-
# For now we assume that this is a list.
265263
return model.List([elem.to_model() for elem in self.elems])
266264

267265

266+
@dataclass(frozen=True)
267+
class TupleArg(TypeArg):
268+
"""Sequence of type arguments for a :class:`TupleParam`."""
269+
270+
elems: list[TypeArg]
271+
272+
def _to_serial(self) -> stys.TupleArg:
273+
return stys.TupleArg(elems=ser_it(self.elems))
274+
275+
def resolve(self, registry: ext.ExtensionRegistry) -> TypeArg:
276+
return TupleArg([arg.resolve(registry) for arg in self.elems])
277+
278+
def __str__(self) -> str:
279+
return f"({comma_sep_str(self.elems)})"
280+
281+
def to_model(self) -> model.Term:
282+
return model.Tuple([elem.to_model() for elem in self.elems])
283+
284+
268285
@dataclass(frozen=True)
269286
class VariableArg(TypeArg):
270287
"""A type argument variable."""

hugr-py/tests/test_tys.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@
2222
PolyFuncType,
2323
Qubit,
2424
RowVariable,
25-
SequenceArg,
25+
ListArg,
26+
TupleArg,
2627
StringArg,
2728
StringParam,
2829
Sum,
@@ -107,7 +108,11 @@ def test_params_str(param: TypeParam, string: str):
107108
(BoundedNatArg(3), "3"),
108109
(StringArg("hello"), '"hello"'),
109110
(
110-
SequenceArg([TypeTypeArg(Qubit), BoundedNatArg(3)]),
111+
ListArg([TypeTypeArg(Qubit), BoundedNatArg(3)]),
112+
"[Type(Qubit), 3]",
113+
),
114+
(
115+
TupleArg([TypeTypeArg(Qubit), BoundedNatArg(3)]),
111116
"(Type(Qubit), 3)",
112117
),
113118
(VariableArg(2, StringParam()), "$2"),

0 commit comments

Comments
 (0)