{"id":"62bc28b7ca8f7e65","repo":"pypa/pip","slug":"can-t-perform-this-operation-for-unregistered-load","errorCode":null,"errorMessage":"Can't perform this operation for unregistered loader type","messagePattern":"Can't perform this operation for unregistered loader type","errorType":"exception","errorClass":"NotImplementedError","httpStatus":null,"severity":"error","filePath":"src/pip/_vendor/pkg_resources/__init__.py","lineNumber":1728,"sourceCode":"        namespace['__file__'] = script_filename\n        if os.path.exists(script_filename):\n            source = _read_utf8_with_fallback(script_filename)\n            code = compile(source, script_filename, 'exec')\n            exec(code, namespace, namespace)\n        else:\n            from linecache import cache\n\n            cache[script_filename] = (\n                len(script_text),\n                0,\n                script_text.split('\\n'),\n                script_filename,\n            )\n            script_code = compile(script_text, script_filename, 'exec')\n            exec(script_code, namespace, namespace)\n\n    def _has(self, path) -> bool:\n        raise NotImplementedError(\n            \"Can't perform this operation for unregistered loader type\"\n        )\n\n    def _isdir(self, path) -> bool:\n        raise NotImplementedError(\n            \"Can't perform this operation for unregistered loader type\"\n        )\n\n    def _listdir(self, path) -> list[str]:\n        raise NotImplementedError(\n            \"Can't perform this operation for unregistered loader type\"\n        )\n\n    def _fn(self, base: str | None, resource_name: str):\n        if base is None:\n            raise TypeError(\n                \"`base` parameter in `_fn` is `None`. Either override this method or check the parameter first.\"\n            )","sourceCodeStart":1710,"sourceCodeEnd":1746,"githubUrl":"https://github.com/pypa/pip/blob/d7d0d0a39494e28ec1c407bd0680e4a4d1067791/src/pip/_vendor/pkg_resources/__init__.py#L1710-L1746","documentation":"Raised as NotImplementedError by NullProvider._has(path), the base implementation that checks whether a resource path exists. NullProvider is the catch-all provider registered for the generic `object` loader type (register_loader_type(object, NullProvider)); it has no filesystem semantics, so subclasses (DefaultProvider, EggProvider, ZipProvider) override _has with real implementations. If a module's loader type was never registered with a concrete provider, you get NullProvider and these stubs fire.","triggerScenarios":"Calling has_resource() (or any API delegating to _has, e.g. metadata_has_metadata checks) on a module whose import loader only maps to NullProvider, i.e. a loader type for which no richer provider was registered via register_loader_type().","commonSituations":"Custom PEP 302/451 import hooks, frozen/embedded modules, or runtime-generated modules whose loader type is not in the provider registry. The module is importable but pkg_resources cannot introspect its resource tree.","solutions":["Register a concrete provider for your loader type with pkg_resources.register_loader_type(MyLoader, DefaultProvider) (or a custom provider subclass overriding _has/_isdir/_listdir/_get).","Use importlib.resources.files() / Traversable, which is the supported replacement and handles arbitrary loaders via importlib's own machinery.","Catch NotImplementedError and degrade gracefully if filesystem-style resource queries are unavailable for that loader."],"exampleFix":"// before\npkg_resources.has_resource('mymod/data.txt')  # NotImplementedError on exotic loader\n\n// after\nfrom importlib.resources import files\nexists = (files('mymod') / 'data.txt').is_file()","handlingStrategy":"validation","validationCode":"import pkg_resources\nfrom pkg_resources import NullProvider, DefaultProvider\n\ndef can_has_resource(module):\n    provider = pkg_resources.get_provider(module)\n    # NullProvider._has is the unimplemented stub; concrete providers override it\n    return type(provider)._has is not NullProvider._has","typeGuard":"from pkg_resources import NullProvider\n\ndef has_concrete_provider(provider):\n    return type(provider)._has is not NullProvider._has","tryCatchPattern":"try:\n    exists = pkg_resources.has_resource(module, name)\nexcept NotImplementedError:\n    exists = None  # unsupported for this loader","preventionTips":["Register a concrete provider for custom loaders via register_loader_type().","Use importlib.resources (files().is_file()) which works across loaders.","Catch NotImplementedError when querying resources for unknown loader types."],"tags":["pkg-resources","loader","provider","not-implemented","resources"],"analyzedSha":"d7d0d0a39494e28ec1c407bd0680e4a4d1067791","analyzedAt":"2026-08-04T20:55:04.259Z","schemaVersion":2}