{"record":{"id":"34d379603156cf90","repo":"microsoft/qlib","slug":"unsupported-type","errorCode":null,"errorMessage":"Unsupported type","messagePattern":"Unsupported type","errorType":"exception","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"qlib/data/dataset/loader.py","lineNumber":100,"sourceCode":"                or\n                <config> := <fields_info>\n\n                <fields_info> := [\"expr\", ...] | ([\"expr\", ...], [\"col_name\", ...])\n                # NOTE: list or tuple will be treated as the things when parsing\n        \"\"\"\n        self.is_group = isinstance(config, dict)\n\n        if self.is_group:\n            self.fields = {grp: self._parse_fields_info(fields_info) for grp, fields_info in config.items()}\n        else:\n            self.fields = self._parse_fields_info(config)\n\n    def _parse_fields_info(self, fields_info: Union[list, tuple]) -> Tuple[list, list]:\n        if len(fields_info) == 0:\n            raise ValueError(\"The size of fields must be greater than 0\")\n\n        if not isinstance(fields_info, (list, tuple)):\n            raise TypeError(\"Unsupported type\")\n\n        if isinstance(fields_info[0], str):\n            exprs = names = fields_info\n        elif isinstance(fields_info[0], (list, tuple)):\n            exprs, names = fields_info\n        else:\n            raise NotImplementedError(f\"This type of input is not supported\")\n        return exprs, names\n\n    @abc.abstractmethod\n    def load_group_df(\n        self,\n        instruments,\n        exprs: list,\n        names: list,\n        start_time: Union[str, pd.Timestamp] = None,\n        end_time: Union[str, pd.Timestamp] = None,\n        gp_name: str = None,","sourceCodeStart":82,"sourceCodeEnd":118,"githubUrl":"https://github.com/microsoft/qlib/blob/79633dd9506ea689e5400dea0197717b5b3d74b7/qlib/data/dataset/loader.py#L82-L118","documentation":"`_parse_fields_info` requires the fields config to be a list or tuple (either a list of expression strings, or a (expressions, names) pair). Passing e.g. a bare string, an int, or a dict element raises TypeError('Unsupported type').","triggerScenarios":"Passing `fields='$close'` (a single string) instead of a list; a dict per group gone wrong in grouped configs (`config={'grp': '$close'}` instead of `{'grp': ['$close']}`).","commonSituations":"Config sloppiness: single field passed without brackets; group loaders where one group's value is not a list.","solutions":["Wrap in a list: fields=['$close'].","For grouped configs ensure every value is a list/tuple: {'grp1': ['$close'], 'grp2': [...]}."],"exampleFix":"# before\nconfig = {'price': '$close'}\n\n# after\nconfig = {'price': ['$close', '$volume']}","handlingStrategy":"type-guard","validationCode":"def valid_fields_shape(cfg) -> bool:\n    if isinstance(cfg, dict):\n        return all(valid_fields_shape(v) for v in cfg.values())\n    return isinstance(cfg, (list, tuple)) and len(cfg) > 0","typeGuard":"from typing import Union, List, Tuple\n\ndef is_fields_config(v) -> bool:\n    if isinstance(v, dict):\n        return all(is_fields_config(x) for x in v.values())\n    return isinstance(v, (list, tuple)) and len(v) > 0","tryCatchPattern":null,"preventionTips":["Always bracket field expressions in a list, even for one field.","Validate nested group configs recursively before building loaders."],"tags":["fields","loader","type-error"],"backgroundTag":null,"analyzedSha":"79633dd9506ea689e5400dea0197717b5b3d74b7","analyzedAt":"2026-08-15T07:01:27.511Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}