{"id":"b6cc84a7d8c22622","repo":"redis/redis-py","slug":"prefix-must-be-provided","errorCode":null,"errorMessage":"prefix must be provided","messagePattern":"prefix must be provided","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"redis/commands/search/index_definition.py","lineNumber":48,"sourceCode":"        self._append_prefix(prefix)\n        self._append_filter(filter)\n        self._append_language(language_field, language)\n        self._append_score(score_field, score)\n        self._append_payload(payload_field)\n\n    def _append_index_type(self, index_type):\n        \"\"\"Append `ON HASH` or `ON JSON` according to the enum.\"\"\"\n        if index_type is IndexType.HASH:\n            self.args.extend([\"ON\", \"HASH\"])\n        elif index_type is IndexType.JSON:\n            self.args.extend([\"ON\", \"JSON\"])\n        elif index_type is not None:\n            raise RuntimeError(f\"index_type must be one of {list(IndexType)}\")\n\n    def _append_prefix(self, prefix):\n        \"\"\"Append PREFIX.\"\"\"\n        if prefix is None:\n            raise TypeError(\"prefix must be provided\")\n        if len(prefix) > 0:\n            prefix = list_or_args(prefix, [])\n            self.args.append(\"PREFIX\")\n            self.args.append(len(prefix))\n            for p in prefix:\n                self.args.append(p)\n\n    def _append_filter(self, filter):\n        \"\"\"Append FILTER.\"\"\"\n        if filter is not None:\n            self.args.append(\"FILTER\")\n            self.args.append(filter)\n\n    def _append_language(self, language_field, language):\n        \"\"\"Append LANGUAGE_FIELD and LANGUAGE.\"\"\"\n        if language_field is not None:\n            self.args.append(\"LANGUAGE_FIELD\")\n            self.args.append(language_field)","sourceCodeStart":30,"sourceCodeEnd":66,"githubUrl":"https://github.com/redis/redis-py/blob/da03cdc7e8731092b13e395605c3c1fb2de25de1/redis/commands/search/index_definition.py#L30-L66","documentation":"Raised by IndexDefinition._append_prefix when the prefix argument is exactly None. The constructor default is an empty list ([]), so this only triggers when a caller explicitly passes None, which the library treats as a programming mistake rather than 'no prefix'. Pass an empty list to index all keys, or a list of key-prefix strings.","triggerScenarios":"IndexDefinition(prefix=None) or forwarding a variable that is None, e.g. IndexDefinition(prefix=config.get('prefix')) when the key is absent and dict.get returns None.","commonSituations":"Loading prefix from optional config/env that yields None; refactoring a call site that previously omitted prefix and then someone added prefix=None explicitly believing it means 'no prefix'.","solutions":["Pass an empty list for no prefix filtering: IndexDefinition(prefix=[]).","If the value may be None, coalesce it: IndexDefinition(prefix=prefix or []).","Provide the intended prefix list, e.g. IndexDefinition(prefix=['product:'])."],"exampleFix":"// before\nIndexDefinition(prefix=config.get('prefix'))\n// after\nIndexDefinition(prefix=config.get('prefix') or [])","handlingStrategy":"validation","validationCode":"def safe_prefix(p):\n    return p if p is not None else []\n\n# usage: IndexDefinition(prefix=safe_prefix(raw_prefix))","typeGuard":"def is_prefix_ok(p) -> bool:\n    return p is not None and hasattr(p, '__len__')","tryCatchPattern":"try:\n    IndexDefinition(prefix=raw)\nexcept TypeError:\n    IndexDefinition(prefix=[])","preventionTips":["Never pass prefix=None; use [] for 'no prefix'.","Coalesce optional values: prefix or [].","Document that None is rejected while [] is valid."],"tags":["search","search-and-query","argument-error","validation"],"analyzedSha":"da03cdc7e8731092b13e395605c3c1fb2de25de1","analyzedAt":"2026-08-04T20:26:47.563Z","schemaVersion":2}