diff --git a/crates/ruff_linter/src/rules/pylint/rules/missing_maxsplit_arg.rs b/crates/ruff_linter/src/rules/pylint/rules/missing_maxsplit_arg.rs index f615ed6cef..091351c898 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/missing_maxsplit_arg.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/missing_maxsplit_arg.rs @@ -6,8 +6,9 @@ use ruff_python_ast::{ use ruff_python_semantic::{SemanticModel, analyze::typing}; use ruff_text_size::Ranged; -use crate::Violation; use crate::checkers::ast::Checker; +use crate::fix; +use crate::{AlwaysFixableViolation, Applicability, Edit, Fix}; /// ## What it does /// Checks for access to the first or last element of `str.split()` or `str.rsplit()` without @@ -35,10 +36,14 @@ use crate::checkers::ast::Checker; /// url = "www.example.com" /// suffix = url.rsplit(".", maxsplit=1)[-1] /// ``` +/// +/// ## Fix Safety +/// This rule's fix is marked as unsafe for `split()`/`rsplit()` calls that contain `**kwargs`, as +/// adding a `maxsplit` keyword to such a call may lead to a duplicate keyword argument error. #[derive(ViolationMetadata)] pub(crate) struct MissingMaxsplitArg { - index: SliceBoundary, actual_split_type: String, + suggested_split_type: String, } /// Represents the index of the slice used for this rule (which can only be 0 or -1) @@ -47,25 +52,27 @@ enum SliceBoundary { Last, } -impl Violation for MissingMaxsplitArg { +impl AlwaysFixableViolation for MissingMaxsplitArg { #[derive_message_formats] fn message(&self) -> String { let MissingMaxsplitArg { - index, - actual_split_type, + actual_split_type: _, + suggested_split_type, } = self; - let suggested_split_type = match index { - SliceBoundary::First => "split", - SliceBoundary::Last => "rsplit", - }; + format!("Replace with `{suggested_split_type}(..., maxsplit=1)`.") + } + + fn fix_title(&self) -> String { + let MissingMaxsplitArg { + actual_split_type, + suggested_split_type, + } = self; if actual_split_type == suggested_split_type { format!("Pass `maxsplit=1` into `str.{actual_split_type}()`") } else { - format!( - "Instead of `str.{actual_split_type}()`, call `str.{suggested_split_type}()` and pass `maxsplit=1`", - ) + format!("Use `str.{suggested_split_type}()` and pass `maxsplit=1`") } } } @@ -123,8 +130,8 @@ pub(crate) fn missing_maxsplit_arg(checker: &Checker, value: &Expr, slice: &Expr }; // Check the function is "split" or "rsplit" - let attr = attr.as_str(); - if !matches!(attr, "split" | "rsplit") { + let actual_split_type = attr.as_str(); + if !matches!(actual_split_type, "split" | "rsplit") { return; } @@ -161,11 +168,48 @@ pub(crate) fn missing_maxsplit_arg(checker: &Checker, value: &Expr, slice: &Expr } } - checker.report_diagnostic( + let suggested_split_type = match slice_boundary { + SliceBoundary::First => "split", + SliceBoundary::Last => "rsplit", + }; + + let maxsplit_argument_edit = fix::edits::add_argument( + "maxsplit=1", + arguments, + checker.comment_ranges(), + checker.locator().contents(), + ); + + // Only change `actual_split_type` if it doesn't match `suggested_split_type` + let split_type_edit: Option = if actual_split_type == suggested_split_type { + None + } else { + Some(Edit::range_replacement( + suggested_split_type.to_string(), + attr.range(), + )) + }; + + let mut diagnostic = checker.report_diagnostic( MissingMaxsplitArg { - index: slice_boundary, - actual_split_type: attr.to_string(), + actual_split_type: actual_split_type.to_string(), + suggested_split_type: suggested_split_type.to_string(), }, expr.range(), ); + + diagnostic.set_fix(Fix::applicable_edits( + maxsplit_argument_edit, + split_type_edit, + // If keyword.arg is `None` (i.e. if the function call contains `**kwargs`), mark the fix as unsafe + if arguments + .keywords + .iter() + .any(|keyword| keyword.arg.is_none()) + { + Applicability::Unsafe + } else { + Applicability::Safe + }, + )); } diff --git a/crates/ruff_linter/src/rules/pylint/snapshots/ruff_linter__rules__pylint__tests__PLC0207_missing_maxsplit_arg.py.snap b/crates/ruff_linter/src/rules/pylint/snapshots/ruff_linter__rules__pylint__tests__PLC0207_missing_maxsplit_arg.py.snap index f1b01001f6..b745ce3eed 100644 --- a/crates/ruff_linter/src/rules/pylint/snapshots/ruff_linter__rules__pylint__tests__PLC0207_missing_maxsplit_arg.py.snap +++ b/crates/ruff_linter/src/rules/pylint/snapshots/ruff_linter__rules__pylint__tests__PLC0207_missing_maxsplit_arg.py.snap @@ -1,7 +1,7 @@ --- source: crates/ruff_linter/src/rules/pylint/mod.rs --- -missing_maxsplit_arg.py:14:1: PLC0207 Pass `maxsplit=1` into `str.split()` +missing_maxsplit_arg.py:14:1: PLC0207 [*] Replace with `split(..., maxsplit=1)`. | 12 | # Errors 13 | ## Test split called directly on string literal @@ -10,8 +10,19 @@ missing_maxsplit_arg.py:14:1: PLC0207 Pass `maxsplit=1` into `str.split()` 15 | "1,2,3".split(",")[-1] # [missing-maxsplit-arg] 16 | "1,2,3".rsplit(",")[0] # [missing-maxsplit-arg] | + = help: Pass `maxsplit=1` into `str.split()` -missing_maxsplit_arg.py:15:1: PLC0207 Instead of `str.split()`, call `str.rsplit()` and pass `maxsplit=1` +ℹ Safe fix +11 11 | +12 12 | # Errors +13 13 | ## Test split called directly on string literal +14 |-"1,2,3".split(",")[0] # [missing-maxsplit-arg] + 14 |+"1,2,3".split(",", maxsplit=1)[0] # [missing-maxsplit-arg] +15 15 | "1,2,3".split(",")[-1] # [missing-maxsplit-arg] +16 16 | "1,2,3".rsplit(",")[0] # [missing-maxsplit-arg] +17 17 | "1,2,3".rsplit(",")[-1] # [missing-maxsplit-arg] + +missing_maxsplit_arg.py:15:1: PLC0207 [*] Replace with `rsplit(..., maxsplit=1)`. | 13 | ## Test split called directly on string literal 14 | "1,2,3".split(",")[0] # [missing-maxsplit-arg] @@ -20,8 +31,19 @@ missing_maxsplit_arg.py:15:1: PLC0207 Instead of `str.split()`, call `str.rsplit 16 | "1,2,3".rsplit(",")[0] # [missing-maxsplit-arg] 17 | "1,2,3".rsplit(",")[-1] # [missing-maxsplit-arg] | + = help: Use `str.rsplit()` and pass `maxsplit=1` -missing_maxsplit_arg.py:16:1: PLC0207 Instead of `str.rsplit()`, call `str.split()` and pass `maxsplit=1` +ℹ Safe fix +12 12 | # Errors +13 13 | ## Test split called directly on string literal +14 14 | "1,2,3".split(",")[0] # [missing-maxsplit-arg] +15 |-"1,2,3".split(",")[-1] # [missing-maxsplit-arg] + 15 |+"1,2,3".rsplit(",", maxsplit=1)[-1] # [missing-maxsplit-arg] +16 16 | "1,2,3".rsplit(",")[0] # [missing-maxsplit-arg] +17 17 | "1,2,3".rsplit(",")[-1] # [missing-maxsplit-arg] +18 18 | + +missing_maxsplit_arg.py:16:1: PLC0207 [*] Replace with `split(..., maxsplit=1)`. | 14 | "1,2,3".split(",")[0] # [missing-maxsplit-arg] 15 | "1,2,3".split(",")[-1] # [missing-maxsplit-arg] @@ -29,8 +51,19 @@ missing_maxsplit_arg.py:16:1: PLC0207 Instead of `str.rsplit()`, call `str.split | ^^^^^^^^^^^^^^^^^^^^^^ PLC0207 17 | "1,2,3".rsplit(",")[-1] # [missing-maxsplit-arg] | + = help: Use `str.split()` and pass `maxsplit=1` -missing_maxsplit_arg.py:17:1: PLC0207 Pass `maxsplit=1` into `str.rsplit()` +ℹ Safe fix +13 13 | ## Test split called directly on string literal +14 14 | "1,2,3".split(",")[0] # [missing-maxsplit-arg] +15 15 | "1,2,3".split(",")[-1] # [missing-maxsplit-arg] +16 |-"1,2,3".rsplit(",")[0] # [missing-maxsplit-arg] + 16 |+"1,2,3".split(",", maxsplit=1)[0] # [missing-maxsplit-arg] +17 17 | "1,2,3".rsplit(",")[-1] # [missing-maxsplit-arg] +18 18 | +19 19 | ## Test split called on string variable + +missing_maxsplit_arg.py:17:1: PLC0207 [*] Replace with `rsplit(..., maxsplit=1)`. | 15 | "1,2,3".split(",")[-1] # [missing-maxsplit-arg] 16 | "1,2,3".rsplit(",")[0] # [missing-maxsplit-arg] @@ -39,8 +72,19 @@ missing_maxsplit_arg.py:17:1: PLC0207 Pass `maxsplit=1` into `str.rsplit()` 18 | 19 | ## Test split called on string variable | + = help: Pass `maxsplit=1` into `str.rsplit()` -missing_maxsplit_arg.py:20:1: PLC0207 Pass `maxsplit=1` into `str.split()` +ℹ Safe fix +14 14 | "1,2,3".split(",")[0] # [missing-maxsplit-arg] +15 15 | "1,2,3".split(",")[-1] # [missing-maxsplit-arg] +16 16 | "1,2,3".rsplit(",")[0] # [missing-maxsplit-arg] +17 |-"1,2,3".rsplit(",")[-1] # [missing-maxsplit-arg] + 17 |+"1,2,3".rsplit(",", maxsplit=1)[-1] # [missing-maxsplit-arg] +18 18 | +19 19 | ## Test split called on string variable +20 20 | SEQ.split(",")[0] # [missing-maxsplit-arg] + +missing_maxsplit_arg.py:20:1: PLC0207 [*] Replace with `split(..., maxsplit=1)`. | 19 | ## Test split called on string variable 20 | SEQ.split(",")[0] # [missing-maxsplit-arg] @@ -48,8 +92,19 @@ missing_maxsplit_arg.py:20:1: PLC0207 Pass `maxsplit=1` into `str.split()` 21 | SEQ.split(",")[-1] # [missing-maxsplit-arg] 22 | SEQ.rsplit(",")[0] # [missing-maxsplit-arg] | + = help: Pass `maxsplit=1` into `str.split()` -missing_maxsplit_arg.py:21:1: PLC0207 Instead of `str.split()`, call `str.rsplit()` and pass `maxsplit=1` +ℹ Safe fix +17 17 | "1,2,3".rsplit(",")[-1] # [missing-maxsplit-arg] +18 18 | +19 19 | ## Test split called on string variable +20 |-SEQ.split(",")[0] # [missing-maxsplit-arg] + 20 |+SEQ.split(",", maxsplit=1)[0] # [missing-maxsplit-arg] +21 21 | SEQ.split(",")[-1] # [missing-maxsplit-arg] +22 22 | SEQ.rsplit(",")[0] # [missing-maxsplit-arg] +23 23 | SEQ.rsplit(",")[-1] # [missing-maxsplit-arg] + +missing_maxsplit_arg.py:21:1: PLC0207 [*] Replace with `rsplit(..., maxsplit=1)`. | 19 | ## Test split called on string variable 20 | SEQ.split(",")[0] # [missing-maxsplit-arg] @@ -58,8 +113,19 @@ missing_maxsplit_arg.py:21:1: PLC0207 Instead of `str.split()`, call `str.rsplit 22 | SEQ.rsplit(",")[0] # [missing-maxsplit-arg] 23 | SEQ.rsplit(",")[-1] # [missing-maxsplit-arg] | + = help: Use `str.rsplit()` and pass `maxsplit=1` -missing_maxsplit_arg.py:22:1: PLC0207 Instead of `str.rsplit()`, call `str.split()` and pass `maxsplit=1` +ℹ Safe fix +18 18 | +19 19 | ## Test split called on string variable +20 20 | SEQ.split(",")[0] # [missing-maxsplit-arg] +21 |-SEQ.split(",")[-1] # [missing-maxsplit-arg] + 21 |+SEQ.rsplit(",", maxsplit=1)[-1] # [missing-maxsplit-arg] +22 22 | SEQ.rsplit(",")[0] # [missing-maxsplit-arg] +23 23 | SEQ.rsplit(",")[-1] # [missing-maxsplit-arg] +24 24 | + +missing_maxsplit_arg.py:22:1: PLC0207 [*] Replace with `split(..., maxsplit=1)`. | 20 | SEQ.split(",")[0] # [missing-maxsplit-arg] 21 | SEQ.split(",")[-1] # [missing-maxsplit-arg] @@ -67,8 +133,19 @@ missing_maxsplit_arg.py:22:1: PLC0207 Instead of `str.rsplit()`, call `str.split | ^^^^^^^^^^^^^^^^^^ PLC0207 23 | SEQ.rsplit(",")[-1] # [missing-maxsplit-arg] | + = help: Use `str.split()` and pass `maxsplit=1` -missing_maxsplit_arg.py:23:1: PLC0207 Pass `maxsplit=1` into `str.rsplit()` +ℹ Safe fix +19 19 | ## Test split called on string variable +20 20 | SEQ.split(",")[0] # [missing-maxsplit-arg] +21 21 | SEQ.split(",")[-1] # [missing-maxsplit-arg] +22 |-SEQ.rsplit(",")[0] # [missing-maxsplit-arg] + 22 |+SEQ.split(",", maxsplit=1)[0] # [missing-maxsplit-arg] +23 23 | SEQ.rsplit(",")[-1] # [missing-maxsplit-arg] +24 24 | +25 25 | ## Test split called on class attribute + +missing_maxsplit_arg.py:23:1: PLC0207 [*] Replace with `rsplit(..., maxsplit=1)`. | 21 | SEQ.split(",")[-1] # [missing-maxsplit-arg] 22 | SEQ.rsplit(",")[0] # [missing-maxsplit-arg] @@ -77,8 +154,19 @@ missing_maxsplit_arg.py:23:1: PLC0207 Pass `maxsplit=1` into `str.rsplit()` 24 | 25 | ## Test split called on class attribute | + = help: Pass `maxsplit=1` into `str.rsplit()` -missing_maxsplit_arg.py:26:1: PLC0207 Pass `maxsplit=1` into `str.split()` +ℹ Safe fix +20 20 | SEQ.split(",")[0] # [missing-maxsplit-arg] +21 21 | SEQ.split(",")[-1] # [missing-maxsplit-arg] +22 22 | SEQ.rsplit(",")[0] # [missing-maxsplit-arg] +23 |-SEQ.rsplit(",")[-1] # [missing-maxsplit-arg] + 23 |+SEQ.rsplit(",", maxsplit=1)[-1] # [missing-maxsplit-arg] +24 24 | +25 25 | ## Test split called on class attribute +26 26 | Foo.class_str.split(",")[0] # [missing-maxsplit-arg] + +missing_maxsplit_arg.py:26:1: PLC0207 [*] Replace with `split(..., maxsplit=1)`. | 25 | ## Test split called on class attribute 26 | Foo.class_str.split(",")[0] # [missing-maxsplit-arg] @@ -86,8 +174,19 @@ missing_maxsplit_arg.py:26:1: PLC0207 Pass `maxsplit=1` into `str.split()` 27 | Foo.class_str.split(",")[-1] # [missing-maxsplit-arg] 28 | Foo.class_str.rsplit(",")[0] # [missing-maxsplit-arg] | + = help: Pass `maxsplit=1` into `str.split()` -missing_maxsplit_arg.py:27:1: PLC0207 Instead of `str.split()`, call `str.rsplit()` and pass `maxsplit=1` +ℹ Safe fix +23 23 | SEQ.rsplit(",")[-1] # [missing-maxsplit-arg] +24 24 | +25 25 | ## Test split called on class attribute +26 |-Foo.class_str.split(",")[0] # [missing-maxsplit-arg] + 26 |+Foo.class_str.split(",", maxsplit=1)[0] # [missing-maxsplit-arg] +27 27 | Foo.class_str.split(",")[-1] # [missing-maxsplit-arg] +28 28 | Foo.class_str.rsplit(",")[0] # [missing-maxsplit-arg] +29 29 | Foo.class_str.rsplit(",")[-1] # [missing-maxsplit-arg] + +missing_maxsplit_arg.py:27:1: PLC0207 [*] Replace with `rsplit(..., maxsplit=1)`. | 25 | ## Test split called on class attribute 26 | Foo.class_str.split(",")[0] # [missing-maxsplit-arg] @@ -96,8 +195,19 @@ missing_maxsplit_arg.py:27:1: PLC0207 Instead of `str.split()`, call `str.rsplit 28 | Foo.class_str.rsplit(",")[0] # [missing-maxsplit-arg] 29 | Foo.class_str.rsplit(",")[-1] # [missing-maxsplit-arg] | + = help: Use `str.rsplit()` and pass `maxsplit=1` -missing_maxsplit_arg.py:28:1: PLC0207 Instead of `str.rsplit()`, call `str.split()` and pass `maxsplit=1` +ℹ Safe fix +24 24 | +25 25 | ## Test split called on class attribute +26 26 | Foo.class_str.split(",")[0] # [missing-maxsplit-arg] +27 |-Foo.class_str.split(",")[-1] # [missing-maxsplit-arg] + 27 |+Foo.class_str.rsplit(",", maxsplit=1)[-1] # [missing-maxsplit-arg] +28 28 | Foo.class_str.rsplit(",")[0] # [missing-maxsplit-arg] +29 29 | Foo.class_str.rsplit(",")[-1] # [missing-maxsplit-arg] +30 30 | + +missing_maxsplit_arg.py:28:1: PLC0207 [*] Replace with `split(..., maxsplit=1)`. | 26 | Foo.class_str.split(",")[0] # [missing-maxsplit-arg] 27 | Foo.class_str.split(",")[-1] # [missing-maxsplit-arg] @@ -105,8 +215,19 @@ missing_maxsplit_arg.py:28:1: PLC0207 Instead of `str.rsplit()`, call `str.split | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLC0207 29 | Foo.class_str.rsplit(",")[-1] # [missing-maxsplit-arg] | + = help: Use `str.split()` and pass `maxsplit=1` -missing_maxsplit_arg.py:29:1: PLC0207 Pass `maxsplit=1` into `str.rsplit()` +ℹ Safe fix +25 25 | ## Test split called on class attribute +26 26 | Foo.class_str.split(",")[0] # [missing-maxsplit-arg] +27 27 | Foo.class_str.split(",")[-1] # [missing-maxsplit-arg] +28 |-Foo.class_str.rsplit(",")[0] # [missing-maxsplit-arg] + 28 |+Foo.class_str.split(",", maxsplit=1)[0] # [missing-maxsplit-arg] +29 29 | Foo.class_str.rsplit(",")[-1] # [missing-maxsplit-arg] +30 30 | +31 31 | ## Test split called on sliced string + +missing_maxsplit_arg.py:29:1: PLC0207 [*] Replace with `rsplit(..., maxsplit=1)`. | 27 | Foo.class_str.split(",")[-1] # [missing-maxsplit-arg] 28 | Foo.class_str.rsplit(",")[0] # [missing-maxsplit-arg] @@ -115,8 +236,19 @@ missing_maxsplit_arg.py:29:1: PLC0207 Pass `maxsplit=1` into `str.rsplit()` 30 | 31 | ## Test split called on sliced string | + = help: Pass `maxsplit=1` into `str.rsplit()` -missing_maxsplit_arg.py:32:1: PLC0207 Pass `maxsplit=1` into `str.split()` +ℹ Safe fix +26 26 | Foo.class_str.split(",")[0] # [missing-maxsplit-arg] +27 27 | Foo.class_str.split(",")[-1] # [missing-maxsplit-arg] +28 28 | Foo.class_str.rsplit(",")[0] # [missing-maxsplit-arg] +29 |-Foo.class_str.rsplit(",")[-1] # [missing-maxsplit-arg] + 29 |+Foo.class_str.rsplit(",", maxsplit=1)[-1] # [missing-maxsplit-arg] +30 30 | +31 31 | ## Test split called on sliced string +32 32 | "1,2,3"[::-1].split(",")[0] # [missing-maxsplit-arg] + +missing_maxsplit_arg.py:32:1: PLC0207 [*] Replace with `split(..., maxsplit=1)`. | 31 | ## Test split called on sliced string 32 | "1,2,3"[::-1].split(",")[0] # [missing-maxsplit-arg] @@ -124,8 +256,19 @@ missing_maxsplit_arg.py:32:1: PLC0207 Pass `maxsplit=1` into `str.split()` 33 | "1,2,3"[::-1][::-1].split(",")[0] # [missing-maxsplit-arg] 34 | SEQ[:3].split(",")[0] # [missing-maxsplit-arg] | + = help: Pass `maxsplit=1` into `str.split()` -missing_maxsplit_arg.py:33:1: PLC0207 Pass `maxsplit=1` into `str.split()` +ℹ Safe fix +29 29 | Foo.class_str.rsplit(",")[-1] # [missing-maxsplit-arg] +30 30 | +31 31 | ## Test split called on sliced string +32 |-"1,2,3"[::-1].split(",")[0] # [missing-maxsplit-arg] + 32 |+"1,2,3"[::-1].split(",", maxsplit=1)[0] # [missing-maxsplit-arg] +33 33 | "1,2,3"[::-1][::-1].split(",")[0] # [missing-maxsplit-arg] +34 34 | SEQ[:3].split(",")[0] # [missing-maxsplit-arg] +35 35 | Foo.class_str[1:3].split(",")[-1] # [missing-maxsplit-arg] + +missing_maxsplit_arg.py:33:1: PLC0207 [*] Replace with `split(..., maxsplit=1)`. | 31 | ## Test split called on sliced string 32 | "1,2,3"[::-1].split(",")[0] # [missing-maxsplit-arg] @@ -134,8 +277,19 @@ missing_maxsplit_arg.py:33:1: PLC0207 Pass `maxsplit=1` into `str.split()` 34 | SEQ[:3].split(",")[0] # [missing-maxsplit-arg] 35 | Foo.class_str[1:3].split(",")[-1] # [missing-maxsplit-arg] | + = help: Pass `maxsplit=1` into `str.split()` -missing_maxsplit_arg.py:34:1: PLC0207 Pass `maxsplit=1` into `str.split()` +ℹ Safe fix +30 30 | +31 31 | ## Test split called on sliced string +32 32 | "1,2,3"[::-1].split(",")[0] # [missing-maxsplit-arg] +33 |-"1,2,3"[::-1][::-1].split(",")[0] # [missing-maxsplit-arg] + 33 |+"1,2,3"[::-1][::-1].split(",", maxsplit=1)[0] # [missing-maxsplit-arg] +34 34 | SEQ[:3].split(",")[0] # [missing-maxsplit-arg] +35 35 | Foo.class_str[1:3].split(",")[-1] # [missing-maxsplit-arg] +36 36 | "1,2,3"[::-1].rsplit(",")[0] # [missing-maxsplit-arg] + +missing_maxsplit_arg.py:34:1: PLC0207 [*] Replace with `split(..., maxsplit=1)`. | 32 | "1,2,3"[::-1].split(",")[0] # [missing-maxsplit-arg] 33 | "1,2,3"[::-1][::-1].split(",")[0] # [missing-maxsplit-arg] @@ -144,8 +298,19 @@ missing_maxsplit_arg.py:34:1: PLC0207 Pass `maxsplit=1` into `str.split()` 35 | Foo.class_str[1:3].split(",")[-1] # [missing-maxsplit-arg] 36 | "1,2,3"[::-1].rsplit(",")[0] # [missing-maxsplit-arg] | + = help: Pass `maxsplit=1` into `str.split()` -missing_maxsplit_arg.py:35:1: PLC0207 Instead of `str.split()`, call `str.rsplit()` and pass `maxsplit=1` +ℹ Safe fix +31 31 | ## Test split called on sliced string +32 32 | "1,2,3"[::-1].split(",")[0] # [missing-maxsplit-arg] +33 33 | "1,2,3"[::-1][::-1].split(",")[0] # [missing-maxsplit-arg] +34 |-SEQ[:3].split(",")[0] # [missing-maxsplit-arg] + 34 |+SEQ[:3].split(",", maxsplit=1)[0] # [missing-maxsplit-arg] +35 35 | Foo.class_str[1:3].split(",")[-1] # [missing-maxsplit-arg] +36 36 | "1,2,3"[::-1].rsplit(",")[0] # [missing-maxsplit-arg] +37 37 | SEQ[:3].rsplit(",")[0] # [missing-maxsplit-arg] + +missing_maxsplit_arg.py:35:1: PLC0207 [*] Replace with `rsplit(..., maxsplit=1)`. | 33 | "1,2,3"[::-1][::-1].split(",")[0] # [missing-maxsplit-arg] 34 | SEQ[:3].split(",")[0] # [missing-maxsplit-arg] @@ -154,8 +319,19 @@ missing_maxsplit_arg.py:35:1: PLC0207 Instead of `str.split()`, call `str.rsplit 36 | "1,2,3"[::-1].rsplit(",")[0] # [missing-maxsplit-arg] 37 | SEQ[:3].rsplit(",")[0] # [missing-maxsplit-arg] | + = help: Use `str.rsplit()` and pass `maxsplit=1` -missing_maxsplit_arg.py:36:1: PLC0207 Instead of `str.rsplit()`, call `str.split()` and pass `maxsplit=1` +ℹ Safe fix +32 32 | "1,2,3"[::-1].split(",")[0] # [missing-maxsplit-arg] +33 33 | "1,2,3"[::-1][::-1].split(",")[0] # [missing-maxsplit-arg] +34 34 | SEQ[:3].split(",")[0] # [missing-maxsplit-arg] +35 |-Foo.class_str[1:3].split(",")[-1] # [missing-maxsplit-arg] + 35 |+Foo.class_str[1:3].rsplit(",", maxsplit=1)[-1] # [missing-maxsplit-arg] +36 36 | "1,2,3"[::-1].rsplit(",")[0] # [missing-maxsplit-arg] +37 37 | SEQ[:3].rsplit(",")[0] # [missing-maxsplit-arg] +38 38 | Foo.class_str[1:3].rsplit(",")[-1] # [missing-maxsplit-arg] + +missing_maxsplit_arg.py:36:1: PLC0207 [*] Replace with `split(..., maxsplit=1)`. | 34 | SEQ[:3].split(",")[0] # [missing-maxsplit-arg] 35 | Foo.class_str[1:3].split(",")[-1] # [missing-maxsplit-arg] @@ -164,8 +340,19 @@ missing_maxsplit_arg.py:36:1: PLC0207 Instead of `str.rsplit()`, call `str.split 37 | SEQ[:3].rsplit(",")[0] # [missing-maxsplit-arg] 38 | Foo.class_str[1:3].rsplit(",")[-1] # [missing-maxsplit-arg] | + = help: Use `str.split()` and pass `maxsplit=1` -missing_maxsplit_arg.py:37:1: PLC0207 Instead of `str.rsplit()`, call `str.split()` and pass `maxsplit=1` +ℹ Safe fix +33 33 | "1,2,3"[::-1][::-1].split(",")[0] # [missing-maxsplit-arg] +34 34 | SEQ[:3].split(",")[0] # [missing-maxsplit-arg] +35 35 | Foo.class_str[1:3].split(",")[-1] # [missing-maxsplit-arg] +36 |-"1,2,3"[::-1].rsplit(",")[0] # [missing-maxsplit-arg] + 36 |+"1,2,3"[::-1].split(",", maxsplit=1)[0] # [missing-maxsplit-arg] +37 37 | SEQ[:3].rsplit(",")[0] # [missing-maxsplit-arg] +38 38 | Foo.class_str[1:3].rsplit(",")[-1] # [missing-maxsplit-arg] +39 39 | + +missing_maxsplit_arg.py:37:1: PLC0207 [*] Replace with `split(..., maxsplit=1)`. | 35 | Foo.class_str[1:3].split(",")[-1] # [missing-maxsplit-arg] 36 | "1,2,3"[::-1].rsplit(",")[0] # [missing-maxsplit-arg] @@ -173,8 +360,19 @@ missing_maxsplit_arg.py:37:1: PLC0207 Instead of `str.rsplit()`, call `str.split | ^^^^^^^^^^^^^^^^^^^^^^ PLC0207 38 | Foo.class_str[1:3].rsplit(",")[-1] # [missing-maxsplit-arg] | + = help: Use `str.split()` and pass `maxsplit=1` -missing_maxsplit_arg.py:38:1: PLC0207 Pass `maxsplit=1` into `str.rsplit()` +ℹ Safe fix +34 34 | SEQ[:3].split(",")[0] # [missing-maxsplit-arg] +35 35 | Foo.class_str[1:3].split(",")[-1] # [missing-maxsplit-arg] +36 36 | "1,2,3"[::-1].rsplit(",")[0] # [missing-maxsplit-arg] +37 |-SEQ[:3].rsplit(",")[0] # [missing-maxsplit-arg] + 37 |+SEQ[:3].split(",", maxsplit=1)[0] # [missing-maxsplit-arg] +38 38 | Foo.class_str[1:3].rsplit(",")[-1] # [missing-maxsplit-arg] +39 39 | +40 40 | ## Test sep given as named argument + +missing_maxsplit_arg.py:38:1: PLC0207 [*] Replace with `rsplit(..., maxsplit=1)`. | 36 | "1,2,3"[::-1].rsplit(",")[0] # [missing-maxsplit-arg] 37 | SEQ[:3].rsplit(",")[0] # [missing-maxsplit-arg] @@ -183,8 +381,19 @@ missing_maxsplit_arg.py:38:1: PLC0207 Pass `maxsplit=1` into `str.rsplit()` 39 | 40 | ## Test sep given as named argument | + = help: Pass `maxsplit=1` into `str.rsplit()` -missing_maxsplit_arg.py:41:1: PLC0207 Pass `maxsplit=1` into `str.split()` +ℹ Safe fix +35 35 | Foo.class_str[1:3].split(",")[-1] # [missing-maxsplit-arg] +36 36 | "1,2,3"[::-1].rsplit(",")[0] # [missing-maxsplit-arg] +37 37 | SEQ[:3].rsplit(",")[0] # [missing-maxsplit-arg] +38 |-Foo.class_str[1:3].rsplit(",")[-1] # [missing-maxsplit-arg] + 38 |+Foo.class_str[1:3].rsplit(",", maxsplit=1)[-1] # [missing-maxsplit-arg] +39 39 | +40 40 | ## Test sep given as named argument +41 41 | "1,2,3".split(sep=",")[0] # [missing-maxsplit-arg] + +missing_maxsplit_arg.py:41:1: PLC0207 [*] Replace with `split(..., maxsplit=1)`. | 40 | ## Test sep given as named argument 41 | "1,2,3".split(sep=",")[0] # [missing-maxsplit-arg] @@ -192,8 +401,19 @@ missing_maxsplit_arg.py:41:1: PLC0207 Pass `maxsplit=1` into `str.split()` 42 | "1,2,3".split(sep=",")[-1] # [missing-maxsplit-arg] 43 | "1,2,3".rsplit(sep=",")[0] # [missing-maxsplit-arg] | + = help: Pass `maxsplit=1` into `str.split()` -missing_maxsplit_arg.py:42:1: PLC0207 Instead of `str.split()`, call `str.rsplit()` and pass `maxsplit=1` +ℹ Safe fix +38 38 | Foo.class_str[1:3].rsplit(",")[-1] # [missing-maxsplit-arg] +39 39 | +40 40 | ## Test sep given as named argument +41 |-"1,2,3".split(sep=",")[0] # [missing-maxsplit-arg] + 41 |+"1,2,3".split(maxsplit=1, sep=",")[0] # [missing-maxsplit-arg] +42 42 | "1,2,3".split(sep=",")[-1] # [missing-maxsplit-arg] +43 43 | "1,2,3".rsplit(sep=",")[0] # [missing-maxsplit-arg] +44 44 | "1,2,3".rsplit(sep=",")[-1] # [missing-maxsplit-arg] + +missing_maxsplit_arg.py:42:1: PLC0207 [*] Replace with `rsplit(..., maxsplit=1)`. | 40 | ## Test sep given as named argument 41 | "1,2,3".split(sep=",")[0] # [missing-maxsplit-arg] @@ -202,8 +422,19 @@ missing_maxsplit_arg.py:42:1: PLC0207 Instead of `str.split()`, call `str.rsplit 43 | "1,2,3".rsplit(sep=",")[0] # [missing-maxsplit-arg] 44 | "1,2,3".rsplit(sep=",")[-1] # [missing-maxsplit-arg] | + = help: Use `str.rsplit()` and pass `maxsplit=1` -missing_maxsplit_arg.py:43:1: PLC0207 Instead of `str.rsplit()`, call `str.split()` and pass `maxsplit=1` +ℹ Safe fix +39 39 | +40 40 | ## Test sep given as named argument +41 41 | "1,2,3".split(sep=",")[0] # [missing-maxsplit-arg] +42 |-"1,2,3".split(sep=",")[-1] # [missing-maxsplit-arg] + 42 |+"1,2,3".rsplit(maxsplit=1, sep=",")[-1] # [missing-maxsplit-arg] +43 43 | "1,2,3".rsplit(sep=",")[0] # [missing-maxsplit-arg] +44 44 | "1,2,3".rsplit(sep=",")[-1] # [missing-maxsplit-arg] +45 45 | + +missing_maxsplit_arg.py:43:1: PLC0207 [*] Replace with `split(..., maxsplit=1)`. | 41 | "1,2,3".split(sep=",")[0] # [missing-maxsplit-arg] 42 | "1,2,3".split(sep=",")[-1] # [missing-maxsplit-arg] @@ -211,8 +442,19 @@ missing_maxsplit_arg.py:43:1: PLC0207 Instead of `str.rsplit()`, call `str.split | ^^^^^^^^^^^^^^^^^^^^^^^^^^ PLC0207 44 | "1,2,3".rsplit(sep=",")[-1] # [missing-maxsplit-arg] | + = help: Use `str.split()` and pass `maxsplit=1` -missing_maxsplit_arg.py:44:1: PLC0207 Pass `maxsplit=1` into `str.rsplit()` +ℹ Safe fix +40 40 | ## Test sep given as named argument +41 41 | "1,2,3".split(sep=",")[0] # [missing-maxsplit-arg] +42 42 | "1,2,3".split(sep=",")[-1] # [missing-maxsplit-arg] +43 |-"1,2,3".rsplit(sep=",")[0] # [missing-maxsplit-arg] + 43 |+"1,2,3".split(maxsplit=1, sep=",")[0] # [missing-maxsplit-arg] +44 44 | "1,2,3".rsplit(sep=",")[-1] # [missing-maxsplit-arg] +45 45 | +46 46 | ## Special cases + +missing_maxsplit_arg.py:44:1: PLC0207 [*] Replace with `rsplit(..., maxsplit=1)`. | 42 | "1,2,3".split(sep=",")[-1] # [missing-maxsplit-arg] 43 | "1,2,3".rsplit(sep=",")[0] # [missing-maxsplit-arg] @@ -221,8 +463,19 @@ missing_maxsplit_arg.py:44:1: PLC0207 Pass `maxsplit=1` into `str.rsplit()` 45 | 46 | ## Special cases | + = help: Pass `maxsplit=1` into `str.rsplit()` -missing_maxsplit_arg.py:47:1: PLC0207 Pass `maxsplit=1` into `str.split()` +ℹ Safe fix +41 41 | "1,2,3".split(sep=",")[0] # [missing-maxsplit-arg] +42 42 | "1,2,3".split(sep=",")[-1] # [missing-maxsplit-arg] +43 43 | "1,2,3".rsplit(sep=",")[0] # [missing-maxsplit-arg] +44 |-"1,2,3".rsplit(sep=",")[-1] # [missing-maxsplit-arg] + 44 |+"1,2,3".rsplit(maxsplit=1, sep=",")[-1] # [missing-maxsplit-arg] +45 45 | +46 46 | ## Special cases +47 47 | "1,2,3".split("\n")[0] # [missing-maxsplit-arg] + +missing_maxsplit_arg.py:47:1: PLC0207 [*] Replace with `split(..., maxsplit=1)`. | 46 | ## Special cases 47 | "1,2,3".split("\n")[0] # [missing-maxsplit-arg] @@ -230,8 +483,19 @@ missing_maxsplit_arg.py:47:1: PLC0207 Pass `maxsplit=1` into `str.split()` 48 | "1,2,3".split("split")[-1] # [missing-maxsplit-arg] 49 | "1,2,3".rsplit("rsplit")[0] # [missing-maxsplit-arg] | + = help: Pass `maxsplit=1` into `str.split()` -missing_maxsplit_arg.py:48:1: PLC0207 Instead of `str.split()`, call `str.rsplit()` and pass `maxsplit=1` +ℹ Safe fix +44 44 | "1,2,3".rsplit(sep=",")[-1] # [missing-maxsplit-arg] +45 45 | +46 46 | ## Special cases +47 |-"1,2,3".split("\n")[0] # [missing-maxsplit-arg] + 47 |+"1,2,3".split("\n", maxsplit=1)[0] # [missing-maxsplit-arg] +48 48 | "1,2,3".split("split")[-1] # [missing-maxsplit-arg] +49 49 | "1,2,3".rsplit("rsplit")[0] # [missing-maxsplit-arg] +50 50 | + +missing_maxsplit_arg.py:48:1: PLC0207 [*] Replace with `rsplit(..., maxsplit=1)`. | 46 | ## Special cases 47 | "1,2,3".split("\n")[0] # [missing-maxsplit-arg] @@ -239,8 +503,19 @@ missing_maxsplit_arg.py:48:1: PLC0207 Instead of `str.split()`, call `str.rsplit | ^^^^^^^^^^^^^^^^^^^^^^^^^^ PLC0207 49 | "1,2,3".rsplit("rsplit")[0] # [missing-maxsplit-arg] | + = help: Use `str.rsplit()` and pass `maxsplit=1` -missing_maxsplit_arg.py:49:1: PLC0207 Instead of `str.rsplit()`, call `str.split()` and pass `maxsplit=1` +ℹ Safe fix +45 45 | +46 46 | ## Special cases +47 47 | "1,2,3".split("\n")[0] # [missing-maxsplit-arg] +48 |-"1,2,3".split("split")[-1] # [missing-maxsplit-arg] + 48 |+"1,2,3".rsplit("split", maxsplit=1)[-1] # [missing-maxsplit-arg] +49 49 | "1,2,3".rsplit("rsplit")[0] # [missing-maxsplit-arg] +50 50 | +51 51 | ## Test class attribute named split + +missing_maxsplit_arg.py:49:1: PLC0207 [*] Replace with `split(..., maxsplit=1)`. | 47 | "1,2,3".split("\n")[0] # [missing-maxsplit-arg] 48 | "1,2,3".split("split")[-1] # [missing-maxsplit-arg] @@ -249,8 +524,19 @@ missing_maxsplit_arg.py:49:1: PLC0207 Instead of `str.rsplit()`, call `str.split 50 | 51 | ## Test class attribute named split | + = help: Use `str.split()` and pass `maxsplit=1` -missing_maxsplit_arg.py:52:1: PLC0207 Pass `maxsplit=1` into `str.split()` +ℹ Safe fix +46 46 | ## Special cases +47 47 | "1,2,3".split("\n")[0] # [missing-maxsplit-arg] +48 48 | "1,2,3".split("split")[-1] # [missing-maxsplit-arg] +49 |-"1,2,3".rsplit("rsplit")[0] # [missing-maxsplit-arg] + 49 |+"1,2,3".split("rsplit", maxsplit=1)[0] # [missing-maxsplit-arg] +50 50 | +51 51 | ## Test class attribute named split +52 52 | Bar.split.split(",")[0] # [missing-maxsplit-arg] + +missing_maxsplit_arg.py:52:1: PLC0207 [*] Replace with `split(..., maxsplit=1)`. | 51 | ## Test class attribute named split 52 | Bar.split.split(",")[0] # [missing-maxsplit-arg] @@ -258,8 +544,19 @@ missing_maxsplit_arg.py:52:1: PLC0207 Pass `maxsplit=1` into `str.split()` 53 | Bar.split.split(",")[-1] # [missing-maxsplit-arg] 54 | Bar.split.rsplit(",")[0] # [missing-maxsplit-arg] | + = help: Pass `maxsplit=1` into `str.split()` -missing_maxsplit_arg.py:53:1: PLC0207 Instead of `str.split()`, call `str.rsplit()` and pass `maxsplit=1` +ℹ Safe fix +49 49 | "1,2,3".rsplit("rsplit")[0] # [missing-maxsplit-arg] +50 50 | +51 51 | ## Test class attribute named split +52 |-Bar.split.split(",")[0] # [missing-maxsplit-arg] + 52 |+Bar.split.split(",", maxsplit=1)[0] # [missing-maxsplit-arg] +53 53 | Bar.split.split(",")[-1] # [missing-maxsplit-arg] +54 54 | Bar.split.rsplit(",")[0] # [missing-maxsplit-arg] +55 55 | Bar.split.rsplit(",")[-1] # [missing-maxsplit-arg] + +missing_maxsplit_arg.py:53:1: PLC0207 [*] Replace with `rsplit(..., maxsplit=1)`. | 51 | ## Test class attribute named split 52 | Bar.split.split(",")[0] # [missing-maxsplit-arg] @@ -268,8 +565,19 @@ missing_maxsplit_arg.py:53:1: PLC0207 Instead of `str.split()`, call `str.rsplit 54 | Bar.split.rsplit(",")[0] # [missing-maxsplit-arg] 55 | Bar.split.rsplit(",")[-1] # [missing-maxsplit-arg] | + = help: Use `str.rsplit()` and pass `maxsplit=1` -missing_maxsplit_arg.py:54:1: PLC0207 Instead of `str.rsplit()`, call `str.split()` and pass `maxsplit=1` +ℹ Safe fix +50 50 | +51 51 | ## Test class attribute named split +52 52 | Bar.split.split(",")[0] # [missing-maxsplit-arg] +53 |-Bar.split.split(",")[-1] # [missing-maxsplit-arg] + 53 |+Bar.split.rsplit(",", maxsplit=1)[-1] # [missing-maxsplit-arg] +54 54 | Bar.split.rsplit(",")[0] # [missing-maxsplit-arg] +55 55 | Bar.split.rsplit(",")[-1] # [missing-maxsplit-arg] +56 56 | + +missing_maxsplit_arg.py:54:1: PLC0207 [*] Replace with `split(..., maxsplit=1)`. | 52 | Bar.split.split(",")[0] # [missing-maxsplit-arg] 53 | Bar.split.split(",")[-1] # [missing-maxsplit-arg] @@ -277,8 +585,19 @@ missing_maxsplit_arg.py:54:1: PLC0207 Instead of `str.rsplit()`, call `str.split | ^^^^^^^^^^^^^^^^^^^^^^^^ PLC0207 55 | Bar.split.rsplit(",")[-1] # [missing-maxsplit-arg] | + = help: Use `str.split()` and pass `maxsplit=1` -missing_maxsplit_arg.py:55:1: PLC0207 Pass `maxsplit=1` into `str.rsplit()` +ℹ Safe fix +51 51 | ## Test class attribute named split +52 52 | Bar.split.split(",")[0] # [missing-maxsplit-arg] +53 53 | Bar.split.split(",")[-1] # [missing-maxsplit-arg] +54 |-Bar.split.rsplit(",")[0] # [missing-maxsplit-arg] + 54 |+Bar.split.split(",", maxsplit=1)[0] # [missing-maxsplit-arg] +55 55 | Bar.split.rsplit(",")[-1] # [missing-maxsplit-arg] +56 56 | +57 57 | ## Test unpacked dict literal kwargs + +missing_maxsplit_arg.py:55:1: PLC0207 [*] Replace with `rsplit(..., maxsplit=1)`. | 53 | Bar.split.split(",")[-1] # [missing-maxsplit-arg] 54 | Bar.split.rsplit(",")[0] # [missing-maxsplit-arg] @@ -287,15 +606,37 @@ missing_maxsplit_arg.py:55:1: PLC0207 Pass `maxsplit=1` into `str.rsplit()` 56 | 57 | ## Test unpacked dict literal kwargs | + = help: Pass `maxsplit=1` into `str.rsplit()` -missing_maxsplit_arg.py:58:1: PLC0207 Pass `maxsplit=1` into `str.split()` +ℹ Safe fix +52 52 | Bar.split.split(",")[0] # [missing-maxsplit-arg] +53 53 | Bar.split.split(",")[-1] # [missing-maxsplit-arg] +54 54 | Bar.split.rsplit(",")[0] # [missing-maxsplit-arg] +55 |-Bar.split.rsplit(",")[-1] # [missing-maxsplit-arg] + 55 |+Bar.split.rsplit(",", maxsplit=1)[-1] # [missing-maxsplit-arg] +56 56 | +57 57 | ## Test unpacked dict literal kwargs +58 58 | "1,2,3".split(**{"sep": ","})[0] # [missing-maxsplit-arg] + +missing_maxsplit_arg.py:58:1: PLC0207 [*] Replace with `split(..., maxsplit=1)`. | 57 | ## Test unpacked dict literal kwargs 58 | "1,2,3".split(**{"sep": ","})[0] # [missing-maxsplit-arg] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLC0207 | + = help: Pass `maxsplit=1` into `str.split()` -missing_maxsplit_arg.py:179:1: PLC0207 Pass `maxsplit=1` into `str.split()` +ℹ Unsafe fix +55 55 | Bar.split.rsplit(",")[-1] # [missing-maxsplit-arg] +56 56 | +57 57 | ## Test unpacked dict literal kwargs +58 |-"1,2,3".split(**{"sep": ","})[0] # [missing-maxsplit-arg] + 58 |+"1,2,3".split(maxsplit=1, **{"sep": ","})[0] # [missing-maxsplit-arg] +59 59 | +60 60 | +61 61 | # OK + +missing_maxsplit_arg.py:179:1: PLC0207 [*] Replace with `split(..., maxsplit=1)`. | 177 | # Errors 178 | kwargs_without_maxsplit = {"seq": ","} @@ -304,8 +645,19 @@ missing_maxsplit_arg.py:179:1: PLC0207 Pass `maxsplit=1` into `str.split()` 180 | # OK 181 | kwargs_with_maxsplit = {"maxsplit": 1} | + = help: Pass `maxsplit=1` into `str.split()` -missing_maxsplit_arg.py:182:1: PLC0207 Pass `maxsplit=1` into `str.split()` +ℹ Unsafe fix +176 176 | ## TODO: These require the ability to resolve a dict variable name to a value +177 177 | # Errors +178 178 | kwargs_without_maxsplit = {"seq": ","} +179 |-"1,2,3".split(**kwargs_without_maxsplit)[0] # TODO: [missing-maxsplit-arg] + 179 |+"1,2,3".split(maxsplit=1, **kwargs_without_maxsplit)[0] # TODO: [missing-maxsplit-arg] +180 180 | # OK +181 181 | kwargs_with_maxsplit = {"maxsplit": 1} +182 182 | "1,2,3".split(",", **kwargs_with_maxsplit)[0] # TODO: false positive + +missing_maxsplit_arg.py:182:1: PLC0207 [*] Replace with `split(..., maxsplit=1)`. | 180 | # OK 181 | kwargs_with_maxsplit = {"maxsplit": 1} @@ -314,11 +666,29 @@ missing_maxsplit_arg.py:182:1: PLC0207 Pass `maxsplit=1` into `str.split()` 183 | kwargs_with_maxsplit = {"sep": ",", "maxsplit": 1} 184 | "1,2,3".split(**kwargs_with_maxsplit)[0] # TODO: false positive | + = help: Pass `maxsplit=1` into `str.split()` -missing_maxsplit_arg.py:184:1: PLC0207 Pass `maxsplit=1` into `str.split()` +ℹ Unsafe fix +179 179 | "1,2,3".split(**kwargs_without_maxsplit)[0] # TODO: [missing-maxsplit-arg] +180 180 | # OK +181 181 | kwargs_with_maxsplit = {"maxsplit": 1} +182 |-"1,2,3".split(",", **kwargs_with_maxsplit)[0] # TODO: false positive + 182 |+"1,2,3".split(",", maxsplit=1, **kwargs_with_maxsplit)[0] # TODO: false positive +183 183 | kwargs_with_maxsplit = {"sep": ",", "maxsplit": 1} +184 184 | "1,2,3".split(**kwargs_with_maxsplit)[0] # TODO: false positive + +missing_maxsplit_arg.py:184:1: PLC0207 [*] Replace with `split(..., maxsplit=1)`. | 182 | "1,2,3".split(",", **kwargs_with_maxsplit)[0] # TODO: false positive 183 | kwargs_with_maxsplit = {"sep": ",", "maxsplit": 1} 184 | "1,2,3".split(**kwargs_with_maxsplit)[0] # TODO: false positive | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLC0207 | + = help: Pass `maxsplit=1` into `str.split()` + +ℹ Unsafe fix +181 181 | kwargs_with_maxsplit = {"maxsplit": 1} +182 182 | "1,2,3".split(",", **kwargs_with_maxsplit)[0] # TODO: false positive +183 183 | kwargs_with_maxsplit = {"sep": ",", "maxsplit": 1} +184 |-"1,2,3".split(**kwargs_with_maxsplit)[0] # TODO: false positive + 184 |+"1,2,3".split(maxsplit=1, **kwargs_with_maxsplit)[0] # TODO: false positive