{"record":{"id":"8ad887aaeda680f0","repo":"astral-sh/ruff","slug":"expected-a-call-or-lambda","errorCode":null,"errorMessage":"Expected a call or lambda","messagePattern":"Expected a call or lambda","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"crates/ruff_linter/src/rules/flake8_comprehensions/fixes.rs","lineNumber":691,"sourceCode":"    let mut tree = match_expression(module_text)?;\n    let call = match_call_mut(&mut tree)?;\n\n    let (lambda, iter) = match call.args.as_slice() {\n        [call] => {\n            let call = match_call(&call.value)?;\n            let [lambda, iter] = call.args.as_slice() else {\n                bail!(\"Expected two arguments\");\n            };\n            let lambda = match_lambda(&lambda.value)?;\n            let iter = &iter.value;\n            (lambda, iter)\n        }\n        [lambda, iter] => {\n            let lambda = match_lambda(&lambda.value)?;\n            let iter = &iter.value;\n            (lambda, iter)\n        }\n        _ => bail!(\"Expected a call or lambda\"),\n    };\n\n    // Format the lambda target.\n    let target = match lambda.params.params.as_slice() {\n        // Ex) `lambda: x`\n        [] => AssignTargetExpression::Name(Box::new(Name {\n            value: \"_\",\n            lpar: vec![],\n            rpar: vec![],\n        })),\n        // Ex) `lambda x: y`\n        [param] => AssignTargetExpression::Name(Box::new(param.name.clone())),\n        // Ex) `lambda x, y: z`\n        params => AssignTargetExpression::Tuple(Box::new(Tuple {\n            elements: params\n                .iter()\n                .map(|param| Element::Simple {\n                    value: Expression::Name(Box::new(param.name.clone())),","sourceCodeStart":673,"sourceCodeEnd":709,"githubUrl":"https://github.com/astral-sh/ruff/blob/26f38c119cac42e4d320ba08f09224fdec74af2c/crates/ruff_linter/src/rules/flake8_comprehensions/fixes.rs#L673-L709","documentation":"Also part of the C417/unnecessary-map fix. The fixer accepts either a single argument that is a call, or two arguments where the first is a lambda. If the outer `map(...)` call's argument list matches neither shape (zero, one non-call, or three-plus arguments), it bails with this message.","triggerScenarios":"`ruff check --fix` on `map(f, a, b)` (multiple iterables), `map(x)` where `x` is not a call, or `map()` with no arguments.","commonSituations":"Multi-iterable `map` calls that a stale C417 diagnostic still points at; `itertools`-style refactorings leaving `map` with extra arguments; hand-written code fed into the fixer.","solutions":["Re-run `ruff check --fix` so the diagnostic matches the current argument list.","Convert multi-iterable `map(f, xs, ys)` to a `zip`-based comprehension manually: `(f(x, y) for x, y in zip(xs, ys))`.","Suppress C417 with noqa for intentionally complex `map` usage."],"exampleFix":"// before\nresult = map(combine, keys, values)\n// after\nresult = (combine(k, v) for k, v in zip(keys, values))","handlingStrategy":"type-guard","validationCode":"shape_ok = (len(m.args) == 1 and isinstance(m.args[0], ast.Call)) or (len(m.args) == 2 and isinstance(m.args[0], ast.Lambda))","typeGuard":"def fixable_map_shape(m):\n    return (isinstance(m, ast.Call) and\n            ((len(m.args) == 1 and isinstance(m.args[0], ast.Call)) or\n             (len(m.args) == 2 and isinstance(m.args[0], ast.Lambda))))","tryCatchPattern":"try:\n    apply_autofix(diagnostic)\nexcept Exception:\n    convert_to_zip_comprehension()","preventionTips":["Convert multi-iterable map(f, xs, ys) to zip-based comprehensions yourself","Suppress C417 for intentionally complex map usage","Refresh diagnostics before fixing"],"tags":["rust","ruff","lint-autofix","flake8-comprehensions"],"backgroundTag":"autofix-unsupported-ast-shape","analyzedSha":"26f38c119cac42e4d320ba08f09224fdec74af2c","analyzedAt":"2026-09-05T10:32:37.492Z","contentChangedAt":"2026-09-05T10:32:37.492Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}