diff --git a/crates/ruff/resources/test/fixtures/flake8_comprehensions/C417.py b/crates/ruff/resources/test/fixtures/flake8_comprehensions/C417.py index a19c606a58..daffead2f8 100644 --- a/crates/ruff/resources/test/fixtures/flake8_comprehensions/C417.py +++ b/crates/ruff/resources/test/fixtures/flake8_comprehensions/C417.py @@ -37,3 +37,6 @@ map(lambda x: lambda x: x, range(4)) map(lambda x=1: x, nums) map(lambda *args: len(args), range(4)) map(lambda **kwargs: len(kwargs), range(4)) + +# Ok because multiple arguments are allowed. +dict(map(lambda k, v: (k, v), keys, values)) diff --git a/crates/ruff/src/rules/flake8_comprehensions/rules/unnecessary_map.rs b/crates/ruff/src/rules/flake8_comprehensions/rules/unnecessary_map.rs index 25ccf295d6..ae00f12d8b 100644 --- a/crates/ruff/src/rules/flake8_comprehensions/rules/unnecessary_map.rs +++ b/crates/ruff/src/rules/flake8_comprehensions/rules/unnecessary_map.rs @@ -89,7 +89,7 @@ pub(crate) fn unnecessary_map( ObjectType::Generator => { // Exclude the parent if already matched by other arms. if parent - .and_then(ruff_python_ast::Expr::as_call_expr) + .and_then(Expr::as_call_expr) .and_then(|call| call.func.as_name_expr()) .is_some_and(|name| matches!(name.id.as_str(), "list" | "set" | "dict")) { @@ -122,7 +122,7 @@ pub(crate) fn unnecessary_map( // Only flag, e.g., `list(map(lambda x: x + 1, iterable))`. let [Expr::Call(ast::ExprCall { func, - arguments: Arguments { args, .. }, + arguments: Arguments { args, keywords, .. }, .. })] = args else { @@ -133,6 +133,10 @@ pub(crate) fn unnecessary_map( return; } + if !keywords.is_empty() { + return; + } + let Some(argument) = helpers::first_argument_with_matching_function("map", func, args) else { return; @@ -163,13 +167,21 @@ pub(crate) fn unnecessary_map( // Only flag, e.g., `dict(map(lambda v: (v, v ** 2), values))`. let [Expr::Call(ast::ExprCall { func, - arguments: Arguments { args, .. }, + arguments: Arguments { args, keywords, .. }, .. })] = args else { return; }; + if args.len() != 2 { + return; + } + + if !keywords.is_empty() { + return; + } + let Some(argument) = helpers::first_argument_with_matching_function("map", func, args) else { return;