{"id":"fde6d53ca2d96972","repo":"pypa/pip","slug":"cannot-combine-specifiersets-with-true-and-false-p","errorCode":null,"errorMessage":"Cannot combine SpecifierSets with True and False prerelease overrides.","messagePattern":"Cannot combine SpecifierSets with True and False prerelease overrides\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"src/pip/_vendor/packaging/specifiers.py","lineNumber":1568,"sourceCode":"        \"\"\"\n        if isinstance(other, str):\n            other = SpecifierSet(other)\n        elif not isinstance(other, SpecifierSet):\n            return NotImplemented\n\n        specifier = SpecifierSet()\n        specifier._specs = self._specs + other._specs\n        specifier._canonicalized = len(specifier._specs) <= 1\n        specifier._has_arbitrary = self._has_arbitrary or other._has_arbitrary\n        specifier._resolved_ops = None\n\n        # Combine prerelease settings: use common or non-None value\n        if self._prereleases is None or self._prereleases == other._prereleases:\n            specifier._prereleases = other._prereleases\n        elif other._prereleases is None:\n            specifier._prereleases = self._prereleases\n        else:\n            raise ValueError(\n                \"Cannot combine SpecifierSets with True and False prerelease overrides.\"\n            )\n\n        return specifier\n\n    def __eq__(self, other: object) -> bool:\n        \"\"\"Whether or not the two SpecifierSet-like objects are equal.\n\n        :param other: The other object to check against.\n\n        The value of :attr:`prereleases` is ignored.\n\n        >>> SpecifierSet(\">=1.0.0,!=1.0.1\") == SpecifierSet(\">=1.0.0,!=1.0.1\")\n        True\n        >>> (SpecifierSet(\">=1.0.0,!=1.0.1\", prereleases=False) ==\n        ...  SpecifierSet(\">=1.0.0,!=1.0.1\", prereleases=True))\n        True\n        >>> SpecifierSet(\">=1.0.0,!=1.0.1\") == \">=1.0.0,!=1.0.1\"","sourceCodeStart":1550,"sourceCodeEnd":1586,"githubUrl":"https://github.com/pypa/pip/blob/d7d0d0a39494e28ec1c407bd0680e4a4d1067791/src/pip/_vendor/packaging/specifiers.py#L1550-L1586","documentation":"Raised as ValueError (specifiers.py:1568) by SpecifierSet.__and__ (the '&' operator) when combining two SpecifierSets whose _prereleases overrides are explicitly and contradictorily set (one True, one False). The combine logic picks the common value, or the non-None value, but refuses to silently pick between two opposing explicit overrides.","triggerScenarios":"SpecifierSet('>=1.0', prereleases=True) & SpecifierSet('<=2.0', prereleases=False). Also when intersecting via the & operator on two sets each constructed with an explicit prereleases kwarg of opposite bool values.","commonSituations":"Resolver code that builds specifiers with hardcoded prereleases flags then intersects them. Mixing user-supplied (prereleases=False) and dependency-declared (prereleases=True) specifier sets in one resolution.","solutions":["Make the two operand prereleases overrides agree: set both to None, both to True, or both to False before combining.","Reconstruct one operand without the prereleases kwarg so its _prereleases is None and the other wins.","Decide on a single prereleases policy upstream and apply it consistently to every SpecifierSet in the intersection."],"exampleFix":"# before\nfrom pip._vendor.packaging.specifiers import SpecifierSet\na = SpecifierSet(\">=1.0\", prereleases=True)\nb = SpecifierSet(\"<=2.0\", prereleases=False)\ncombined = a & b  # ValueError\n\n# after\na = SpecifierSet(\">=1.0\", prereleases=True)\nb = SpecifierSet(\"<=2.0\", prereleases=True)\ncombined = a & b","handlingStrategy":"validation","validationCode":"def combinable_prereleases(a: 'SpecifierSet', b: 'SpecifierSet') -> bool:\n    pa, pb = a._prereleases, b._prereleases\n    return pa is None or pb is None or pa == pb","typeGuard":"null","tryCatchPattern":"from pip._vendor.packaging.specifiers import SpecifierSet\ntry:\n    combined = a & b\nexcept ValueError as e:\n    if 'prerelease overrides' in str(e):\n        b = SpecifierSet(str(b), prereleases=a._prereleases)\n        combined = a & b","preventionTips":["Adopt one prereleases policy at the top of your resolver and pass it to every SpecifierSet you build.","Leave prereleases=None unless you have a specific reason to force it."],"tags":["packaging","specifiers","prereleases","logic"],"analyzedSha":"d7d0d0a39494e28ec1c407bd0680e4a4d1067791","analyzedAt":"2026-08-04T20:55:04.259Z","schemaVersion":2}