{"record":{"id":"2005b899d77b8fd3","repo":"deepfakes/faceswap","slug":"dictionary-keys-sorted-inbound-should-be-a-subs","errorCode":null,"errorMessage":"Dictionary keys {sorted(inbound)} should be a subset of dataclass params {sorted(all_fields)}","messagePattern":"Dictionary keys (.+?) should be a subset of dataclass params (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"lib/align/objects.py","lineNumber":175,"sourceCode":"            items.append(v)\n        retval = T.cast(list[T.Any] | tuple[T.Any], tuple(items) if origin is tuple else items)\n        return retval\n\n    @classmethod\n    def from_dict(cls, data_dict: dict[str, T.Any]) -> T.Self:\n        \"\"\"Load the contents from a serialized python dict into this dataclass\n\n        Parameters\n        ----------\n        data_dict\n            The data to load into the dataclass\n        \"\"\"\n        inbound = set(data_dict)\n        all_fields = set(f.name for f in fields(cls))\n        required = set(f.name for f in fields(cls)\n                       if f.default is MISSING and f.default_factory is MISSING)\n        if not inbound.issubset(all_fields):\n            raise ValueError(f\"Dictionary keys {sorted(inbound)} should be a subset of dataclass \"\n                             f\"params {sorted(all_fields)}\")\n        if not required.issubset(inbound):\n            raise ValueError(f\"Dataclass params {sorted(required)} should be a subset of \"\n                             f\"dictionary keys {sorted(inbound)}\")\n        type_hints = T.get_type_hints(cls)\n        kwargs: dict[str, T.Any] = {}\n        for f in fields(cls):\n            if f.name not in data_dict:\n                continue\n            field_type = type_hints.get(f.name)\n            val = data_dict[f.name]\n            converted = cls._convert_dtype(field_type, val)\n            if converted is not None:\n                kwargs[f.name] = converted\n                continue\n            if isinstance(val, dict):\n                kwargs[f.name] = cls._parse_dict(field_type, val)\n                continue","sourceCodeStart":157,"sourceCodeEnd":193,"githubUrl":"https://github.com/deepfakes/faceswap/blob/f530cb7508ae670f6474f8a7d9c4df94705cf96b/lib/align/objects.py#L157-L193","documentation":"Companion check in the same from_dict loader: every dataclass field that has no default/default_factory must be present in the incoming dict. Missing required keys raise ValueError so partially-initialized objects cannot be silently created.","triggerScenarios":"cls.from_dict(data) where data omits a required field (e.g. an Alignment dict without 'landmarks' or 'landmark_type'); often the result of forwarding an old-format dict through the check in error 4 after dropping keys.","commonSituations":"Older alignments format missing newer mandatory fields (pre-2.x files before migration); partial manual dict construction; tests using fixture dicts that were never updated after a field was added.","solutions":["Run the alignments migration for the file (alignments tool / extract job under a supported version, see the version guidance in Alignments.load)","Supply defaults explicitly before from_dict: data.setdefault(field, default) for each missing required field","Regenerate alignments from scratch with the current version"],"exampleFix":"# before\npartial = {\"mask\": [], \"detected_faces\": []}  # missing 'landmarks'\nface = Alignment.from_dict(partial)  # ValueError\n\n# after\npartial.setdefault(\"landmarks\", np.zeros((68, 2), dtype=\"float32\"))\npartial.setdefault(\"landmark_type\", LandmarkType.LM_2D_68)\nface = Alignment.from_dict(partial)","handlingStrategy":"validation","validationCode":"from dataclasses import fields\n\ndef sanitize_for(cls, data):\n    valid = {f.name for f in fields(cls)}\n    return {k: v for k, v in data.items() if k in valid}","typeGuard":null,"tryCatchPattern":"try:\n    obj = MyDataclass.from_dict(payload)\nexcept ValueError as err:\n    if \"should be a subset of dataclass params\" in str(err):\n        obj = MyDataclass.from_dict(sanitize_for(MyDataclass, payload))\n    else:\n        raise","preventionTips":["Pin one Faceswap version for writing and reading alignments","Never hand-edit serialized alignment dicts; use the alignments tool","Filter inbound dict keys through dataclasses.fields before from_dict"],"tags":["faceswap","alignments","serialization","dataclass","required-fields"],"backgroundTag":null,"analyzedSha":"f530cb7508ae670f6474f8a7d9c4df94705cf96b","analyzedAt":"2026-08-15T02:59:26.626Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}