{"record":{"id":"93c3b228477f5c24","repo":"pytest-dev/pytest","slug":"module-modname-r-has-version-verattr-r-re","errorCode":null,"errorMessage":"module {modname!r} has __version__ {verattr!r}, required is: {minversion!r}","messagePattern":"module (.+?) has __version__ (.+?), required is: (.+?)","errorType":"exception","errorClass":"Skipped","httpStatus":null,"severity":"warning","filePath":"src/_pytest/outcomes.py","lineNumber":282,"sourceCode":"            importlib.import_module(modname)\n        except exc_type as exc:\n            # Do not raise or issue warnings inside the catch_warnings() block.\n            if reason is None:\n                reason = f\"could not import {modname!r}: {exc}\"\n            skipped = Skipped(reason, allow_module_level=True)\n    if skipped:\n        raise skipped\n\n    mod = sys.modules[modname]\n    if minversion is None:\n        return mod\n    verattr = getattr(mod, \"__version__\", None)\n    if minversion is not None:\n        # Imported lazily to improve start-up time.\n        from packaging.version import Version\n\n        if verattr is None or Version(verattr) < Version(minversion):\n            raise Skipped(\n                f\"module {modname!r} has __version__ {verattr!r}, required is: {minversion!r}\",\n                allow_module_level=True,\n            )\n    return mod\n","sourceCodeStart":264,"sourceCodeEnd":287,"githubUrl":"https://github.com/pytest-dev/pytest/blob/0d6fbdeffa57c796123f62f81f7dd370d9b7ecdc/src/_pytest/outcomes.py#L264-L287","documentation":"Raised by the import/skip helper (pytest.importorskip with minversion) when the imported module's __version__ is missing or older than the required minversion. At lines 276-285 the helper reads __version__ via getattr; if it is None or Version(verattr) < Version(minversion), a Skipped outcome is raised with allow_module_level=True so the whole module is skipped rather than failed. This is an outcome, not a hard error, used for graceful degradation.","triggerScenarios":"pytest.importorskip('numpy', minversion='1.20') when numpy is older; module lacks __version__ entirely; minversion string malformed so comparison places it above the installed version.","commonSituations":"CI environments with pinned older dependency versions; packages that do not set __version__; typos in the minversion argument; version string formats that packaging.Version mis-parses.","solutions":["Upgrade the dependency to meet minversion: pip install -U <package>.","Lower or correct the minversion argument to match the installed version.","Ensure the module exposes __version__ (set it in the package __init__).","If the version is correct, verify the minversion format is PEP 440 compliant."],"exampleFix":"// before\nmod = pytest.importorskip('numpy', minversion='2.0')\n// after\nmod = pytest.importorskip('numpy', minversion='1.20')","handlingStrategy":"validation","validationCode":"import packaging.version\nver = getattr(__import__('numpy'), '__version__', None)\nif ver is None or packaging.version.Version(ver) < packaging.version.Version('1.20'):\n    pytest.skip('numpy too old')","typeGuard":"def _version_ok(modname, minversion) -> bool:\n    import packaging.version\n    ver = getattr(__import__(modname), '__version__', None)\n    return ver is not None and packaging.version.Version(ver) >= packaging.version.Version(minversion)","tryCatchPattern":null,"preventionTips":["Pin compatible dependency versions in requirements.","Ensure packages expose a PEP 440 __version__."],"tags":["pytest","outcomes","skip","versioning"],"backgroundTag":null,"analyzedSha":"0d6fbdeffa57c796123f62f81f7dd370d9b7ecdc","analyzedAt":"2026-08-11T20:52:36.969Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}