Skip to content

Commit 4171658

Browse files
authored
fix(sagemaker-core): preserve falsy values in serialize() output (#5860)
The walrus check in _serialize_dict and _serialize_list silently dropped False / 0 / "" along with None / Unassigned, because all of them are falsy. Boolean parameters that should reach the wire as False were instead omitted, causing the server to apply its own default (often True), which led to confusing validation errors that contradicted the caller's input. Concrete failure: AIRecommendationJob.create(optimize_model=False) silently sent OptimizeModel=True, then failed with a server message about a missing DatasetConfig — a requirement that only applies when OptimizeModel is True. Replace the walrus truthy guard with an explicit `is not None` check. serialize() already returns None for both None and Unassigned (utils.py line 512), so this preserves the "drop unset fields" semantics while correctly retaining valid falsy payloads. Adds two regression tests covering False / 0 / "" preservation and None / Unassigned removal.
1 parent bb0b615 commit 4171658

2 files changed

Lines changed: 21 additions & 3 deletions

File tree

sagemaker-core/src/sagemaker/core/utils/utils.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -538,9 +538,11 @@ def _serialize_dict(value: Dict) -> dict:
538538
dict: The serialized dict
539539
"""
540540
serialized_dict = {}
541+
# Drop only Unassigned/None; preserve valid falsy values like False, 0, "".
541542
for k, v in value.items():
542-
if serialize_result := serialize(v):
543-
serialized_dict.update({k: serialize_result})
543+
serialize_result = serialize(v)
544+
if serialize_result is not None:
545+
serialized_dict[k] = serialize_result
544546
return serialized_dict
545547

546548

@@ -555,8 +557,10 @@ def _serialize_list(value: List) -> list:
555557
list: The serialized list
556558
"""
557559
serialized_list = []
560+
# Drop only Unassigned/None; preserve valid falsy values like False, 0, "".
558561
for v in value:
559-
if serialize_result := serialize(v):
562+
serialize_result = serialize(v)
563+
if serialize_result is not None:
560564
serialized_list.append(serialize_result)
561565
return serialized_list
562566

sagemaker-core/tests/unit/generated/test_utils.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,20 @@ def test_serialize_method_returns_correct_data():
353353
assert serialized_data["S3Uri"] == "s3/uri"
354354

355355

356+
def test_serialize_preserves_falsy_dict_values():
357+
# Regression: previously False / 0 / "" were stripped along with None.
358+
assert serialize({"k": False}) == {"k": False}
359+
assert serialize({"k": 0}) == {"k": 0}
360+
assert serialize({"k": ""}) == {"k": ""}
361+
assert serialize({"k": None}) == {}
362+
assert serialize({"k": Unassigned()}) == {}
363+
364+
365+
def test_serialize_preserves_falsy_list_values():
366+
assert serialize([False, 0, ""]) == [False, 0, ""]
367+
assert serialize([None, "x", Unassigned(), 1]) == ["x", 1]
368+
369+
356370
def test_serialize_method_nested_shape():
357371
trial_component_parameters = {
358372
"test_num_value": TrialComponentParameterValue(number_value=1),

0 commit comments

Comments
 (0)