Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion luigi/parameter.py
Original file line number Diff line number Diff line change
Expand Up @@ -1766,7 +1766,7 @@ def normalize(self, x):
return tuple(values)

def serialize(self, x):
return self._sep.join(x)
return self._sep.join(str(v) for v in x)


class OptionalChoiceParameter(OptionalParameterMixin[ChoiceType], ChoiceParameter[ChoiceType]): # type: ignore[misc]
Expand Down
17 changes: 17 additions & 0 deletions test/parameter_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -358,6 +358,23 @@ def test_invalid_choice_type(self):
def test_choice_list_param_missing(self):
self.assertRaises(ParameterException, lambda: luigi.parameter.ChoiceListParameter())

def test_choice_list_param_typed_serialize_parse(self):
# ChoiceListParameter with a non-str var_type must serialize its typed
# values. Previously serialize() joined them directly, which raised
# TypeError for int/float and made an int/float ChoiceListParameter
# unusable (task_id computation serializes every parameter).
p = luigi.ChoiceListParameter(var_type=int, choices=[1, 2, 3])
self.assertEqual("1,3", p.serialize((1, 3)))
self.assertEqual((1, 3), p.parse(p.serialize((1, 3))))

pf = luigi.ChoiceListParameter(var_type=float, choices=[1.5, 2.5])
self.assertEqual("1.5,2.5", pf.serialize((1.5, 2.5)))
self.assertEqual((1.5, 2.5), pf.parse(pf.serialize((1.5, 2.5))))

# str var_type (the existing case) is unchanged.
ps = luigi.ChoiceListParameter(var_type=str, choices=["1", "2", "3"])
self.assertEqual("1,3", ps.serialize(("1", "3")))

def test_tuple_serialize_parse(self):
a = luigi.TupleParameter()
b_tuple = ((1, 2), (3, 4))
Expand Down
Loading