{"id":"09189ed34f43658b","repo":"pypa/pip","slug":"base-parameter-in-fn-is-none-either-overri","errorCode":null,"errorMessage":"`base` parameter in `_fn` is `None`. Either override this method or check the parameter first.","messagePattern":"`base` parameter in `_fn` is `None`\\. Either override this method or check the parameter first\\.","errorType":"exception","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"src/pip/_vendor/pkg_resources/__init__.py","lineNumber":1744,"sourceCode":"\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            )\n        self._validate_resource_path(resource_name)\n        if resource_name:\n            return os.path.join(base, *resource_name.split('/'))\n        return base\n\n    @staticmethod\n    def _validate_resource_path(path):\n        \"\"\"\n        Validate the resource paths according to the docs.\n        https://setuptools.pypa.io/en/latest/pkg_resources.html#basic-resource-access\n\n        >>> warned = getfixture('recwarn')\n        >>> warnings.simplefilter('always')\n        >>> vrp = NullProvider._validate_resource_path\n        >>> vrp('foo/bar.txt')\n        >>> bool(warned)","sourceCodeStart":1726,"sourceCodeEnd":1762,"githubUrl":"https://github.com/pypa/pip/blob/d7d0d0a39494e28ec1c407bd0680e4a4d1067791/src/pip/_vendor/pkg_resources/__init__.py#L1726-L1762","documentation":"Raised as TypeError by NullProvider._fn(base, resource_name) when base is None. _fn joins base with the resource name to build a filesystem path; base is normally self.module_path (derived from the module's __file__) for resources, or self.egg_info for metadata. egg_info defaults to None on NullProvider and is only set by EggProvider._set_egg when an egg/.egg-info directory is found among the parent paths.","triggerScenarios":"Calling a metadata method (has_metadata, get_metadata, metadata_isdir, etc.) on a provider whose egg_info is still None — i.e. the module has no discoverable .egg-info/EGG-INFO directory in its parent path. _fn is invoked with base=self.egg_info=None and raises before path construction.","commonSituations":"Querying metadata for a module loaded from a flat directory, an in-memory/custom loader, or a frozen module that has no setuptools metadata directory. Also for built-in/extension modules where __file__ points outside any egg layout.","solutions":["Verify the provider has metadata before calling: `if provider.egg_info: provider.get_metadata(name)`.","Obtain the distribution via pkg_resources.get_distribution() or importlib.metadata, which return a metadata-bearing object, rather than building a provider from a bare module.","Ensure the package is installed with metadata (pip install) so an .egg-info/.dist-info exists alongside the code."],"exampleFix":"// before\nprovider.get_metadata('entry_points.txt')  # TypeError: base is None (no egg_info)\n\n// after\nif provider.egg_info:\n    text = provider.get_metadata('entry_points.txt')\nelse:\n    from importlib import metadata\n    text = metadata.distribution('pkg').metadata  # fall back","handlingStrategy":"validation","validationCode":"import pkg_resources\n\ndef safe_get_metadata(provider, name):\n    if provider.egg_info is None:\n        raise ValueError('No egg_info metadata available for this module')\n    return provider.get_metadata(name)","typeGuard":"def provider_has_metadata_root(provider):\n    return getattr(provider, 'egg_info', None) is not None","tryCatchPattern":"try:\n    text = provider.get_metadata(name)\nexcept TypeError as e:\n    if 'base' in str(e) and 'None' in str(e):\n        from importlib import metadata\n        text = metadata.distribution(pkg).metadata\n    else:\n        raise","preventionTips":["Check provider.egg_info is not None before any metadata method call.","Obtain metadata via pkg_resources.get_distribution() or importlib.metadata rather than a bare module provider.","Install packages with metadata (.egg-info/.dist-info) so egg_info is populated."],"tags":["pkg-resources","metadata","provider","egg-info","type-error"],"analyzedSha":"d7d0d0a39494e28ec1c407bd0680e4a4d1067791","analyzedAt":"2026-08-04T20:55:04.259Z","schemaVersion":2}