{"record":{"id":"3fbe914ca7d24f2e","repo":"pandas-dev/pandas","slug":"invalid-parser-parser-passed-valid-parsers-ar","errorCode":null,"errorMessage":"Invalid parser '{parser}' passed, valid parsers are {PARSERS.keys()}","messagePattern":"Invalid parser '(.+?)' passed, valid parsers are (.+?)","errorType":"exception","errorClass":"KeyError","httpStatus":null,"severity":"error","filePath":"pandas/core/computation/eval.py","lineNumber":97,"sourceCode":"\n    return engine\n\n\ndef _check_parser(parser: str) -> None:\n    \"\"\"\n    Make sure a valid parser is passed.\n\n    Parameters\n    ----------\n    parser : str\n\n    Raises\n    ------\n    KeyError\n      * If an invalid parser is passed\n    \"\"\"\n    if parser not in PARSERS:\n        raise KeyError(\n            f\"Invalid parser '{parser}' passed, valid parsers are {PARSERS.keys()}\"\n        )\n\n\ndef _check_resolvers(resolvers) -> None:\n    if resolvers is not None:\n        for resolver in resolvers:\n            if not hasattr(resolver, \"__getitem__\"):\n                name = type(resolver).__name__\n                raise TypeError(\n                    f\"Resolver of type '{name}' does not \"\n                    \"implement the __getitem__ method\"\n                )\n\n\ndef _check_expression(expr) -> None:\n    \"\"\"\n    Make sure an expression is not an empty string","sourceCodeStart":79,"sourceCodeEnd":115,"githubUrl":"https://github.com/pandas-dev/pandas/blob/71959b8cb9b2459c16e14b34f28b178ccfe14735/pandas/core/computation/eval.py#L79-L115","documentation":"Raised by _check_parser (pandas/core/computation/eval.py:97) as a KeyError when the `parser` argument to pd.eval / DataFrame.eval is not one of the keys in PARSERS (typically 'pandas' and 'python'). The parser determines how the expression string is tokenized (e.g. whether @-prefix locals or special syntax is allowed), so an unknown parser is rejected before parsing.","triggerScenarios":"`pd.eval('a + b', parser='pyparsing')`, `df.eval('a + b', parser='custom')`, a typo, or passing a parser name from a different pandas version.","commonSituations":"Typos, guessing parser names, code migrated across versions where parser naming changed, or dynamic config feeding an unvalidated value.","solutions":["Use a valid parser: 'pandas' or 'python'.","Omit parser to use the default ('pandas' for DataFrame.eval).","If you need @-local variable access, use parser='pandas' (the '@' prefix is only supported by the pandas parser)."],"exampleFix":"# before\npd.eval('a + b', parser='pyparsing')\n\n# after\npd.eval('a + b', parser='pandas')","handlingStrategy":"validation","validationCode":"from pandas.core.computation.expr import PARSERS\n\ndef validate_parser(parser):\n    if parser not in PARSERS:\n        raise KeyError(f\"Invalid parser '{parser}', valid: {list(PARSERS)}\")\n    return parser","typeGuard":"from pandas.core.computation.expr import PARSERS\n\ndef is_valid_parser(parser) -> bool:\n    return parser in PARSERS","tryCatchPattern":"try:\n    result = pd.eval('a + b', parser=parser)\nexcept KeyError as e:\n    if 'Invalid parser' in str(e):\n        result = pd.eval('a + b', parser='pandas')\n    else:\n        raise","preventionTips":["Use 'pandas' or 'python' parser only.","Use parser='pandas' when you need @-prefixed local variables.","Omit parser to accept the default."],"tags":["eval","parser","validation","keyerror"],"analyzedSha":"71959b8cb9b2459c16e14b34f28b178ccfe14735","analyzedAt":"2026-08-07T01:30:20.476Z","schemaVersion":2},"datasetVersion":"2026-08-07T03:17:09.362Z"}