{"record":{"id":"86aa9c82d8e690c1","repo":"microsoft/qlib","slug":"please-implement-the-get-exp-method","errorCode":null,"errorMessage":"Please implement the `_get_exp` method","messagePattern":"Please implement the `_get_exp` method","errorType":"exception","errorClass":"NotImplementedError","httpStatus":null,"severity":"error","filePath":"qlib/workflow/expm.py","lineNumber":267,"sourceCode":"        Get specific experiment by name or id. If it does not exist, raise ValueError.\n\n        Parameters\n        ----------\n        experiment_id :\n            The id of experiment\n        experiment_name :\n            The name of experiment\n\n        Returns\n        -------\n        Experiment:\n            The searched experiment\n\n        Raises\n        ------\n        ValueError\n        \"\"\"\n        raise NotImplementedError(f\"Please implement the `_get_exp` method\")\n\n    def delete_exp(self, experiment_id=None, experiment_name=None):\n        \"\"\"\n        Delete an experiment.\n\n        Parameters\n        ----------\n        experiment_id  : str\n            the experiment id.\n        experiment_name  : str\n            the experiment name.\n        \"\"\"\n        raise NotImplementedError(f\"Please implement the `delete_exp` method.\")\n\n    @property\n    def default_uri(self):\n        \"\"\"\n        Get the default tracking URI from qlib.config.C","sourceCodeStart":249,"sourceCodeEnd":285,"githubUrl":"https://github.com/microsoft/qlib/blob/79633dd9506ea689e5400dea0197717b5b3d74b7/qlib/workflow/expm.py#L249-L285","documentation":"_get_exp is the protected retrieval hook of ExpManager: concrete managers resolve experiment_id/experiment_name to an Experiment or raise ValueError. The base body raises NotImplementedError, so this error indicates the lookup ran on an abstract or incompletely implemented manager rather than MLflowExpManager.","triggerScenarios":"R.get_exp(...) delegating to a manager subclass that overrides get_exp but not _get_exp; directly invoking exp_manager._get_exp(...) in custom code or tests.","commonSituations":"Writing a custom manager backend and missing the private hook despite implementing the public API; scaffolding generated by copying only part of MLflowExpManager.","solutions":["Ensure qlib.init uses MLflowExpManager (default) so _get_exp resolves via client.get_experiment.","Implement _get_exp(self, experiment_id=None, experiment_name=None) in your subclass returning your Experiment type or raising ValueError.","Use the public R.get_exp / exp_manager.get_exp API and implement every private hook they depend on."],"exampleFix":"# before\nclass MyManager(ExpManager):\n    pass\nexp = MyManager().get_exp(experiment_name='e')  # base _get_exp -> NotImplementedError\n\n# after\nclass MyManager(ExpManager):\n    def _get_exp(self, experiment_id=None, experiment_name=None):\n        exp = self.client.get_experiment_by_name(experiment_name) if experiment_name else self.client.get_experiment(experiment_id)\n        if exp is None:\n            raise ValueError('No valid experiment has been found')\n        return MyExperiment(exp.experiment_id, exp.name, self.uri)","handlingStrategy":"type-guard","validationCode":"from qlib.workflow.expm import ExpManager\nassert R.exp_manager.__class__._get_exp is not ExpManager._get_exp, 'experiment lookup not implemented'","typeGuard":"def manager_can_get_exp(mgr) -> bool:\n    from qlib.workflow.expm import ExpManager\n    return mgr.__class__._get_exp is not ExpManager._get_exp","tryCatchPattern":null,"preventionTips":["Implement private hooks (_get_exp, _start_exp, _end_exp) in any custom manager, since public methods delegate to them.","Use R.get_exp instead of touching _get_exp directly."],"tags":["qlib","abstract-method","not-implemented","exp-manager","protected-api"],"backgroundTag":null,"analyzedSha":"79633dd9506ea689e5400dea0197717b5b3d74b7","analyzedAt":"2026-08-15T07:01:27.511Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}