Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -182,3 +182,27 @@ def get_string(self) -> str:
"1,2,3".split(",", **kwargs_with_maxsplit)[0] # TODO: false positive
kwargs_with_maxsplit = {"sep": ",", "maxsplit": 1}
"1,2,3".split(**kwargs_with_maxsplit)[0] # TODO: false positive


## Test unpacked list literal args (starred expressions)
# Errors
"1,2,3".split(",", *[-1])[0]
"1,2,3".split(",", *[1])[0]
"1,2,3".rsplit(",", *[-1])[-1]
"1,2,3".rsplit(",", *[1])[-1]

## Test unpacked list variable args
# Errors
args_list = [-1]
"1,2,3".split(",", *args_list)[0]
args_list = [1]
"1,2,3".split(",", *args_list)[0]
args_list = [-1]
"1,2,3".rsplit(",", *args_list)[-1]
args_list = [1]
"1,2,3".rsplit(",", *args_list)[-1]

## Test mixed unpacked args and kwargs
# Errors
"1,2,3".split(",", *[-1], **{"maxsplit": 1})[0]
"1,2,3".split(",", *[1], **{"maxsplit": 1})[0]
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@ use crate::{AlwaysFixableViolation, Applicability, Edit, Fix};
/// ```
///
/// ## 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.
/// This rule's fix is marked as unsafe for `split()`/`rsplit()` calls that contain `*args` or `**kwargs`, as
/// adding a `maxsplit` keyword to such a call may lead to a duplicate keyword argument error or too many arguments error.
#[derive(ViolationMetadata)]
pub(crate) struct MissingMaxsplitArg {
actual_split_type: String,
Expand Down Expand Up @@ -201,11 +201,12 @@ pub(crate) fn missing_maxsplit_arg(checker: &Checker, value: &Expr, slice: &Expr
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())
// If there are starred expressions (*args) or keyword arguments with None arg (**kwargs), mark the fix as unsafe
if arguments.args.iter().any(Expr::is_starred_expr)
|| arguments
.keywords
.iter()
.any(|keyword| keyword.arg.is_none())
{
Applicability::Unsafe
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -676,6 +676,7 @@ missing_maxsplit_arg.py:182:1: PLC0207 [*] Replace with `split(..., maxsplit=1)`
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
185 185 |

missing_maxsplit_arg.py:184:1: PLC0207 [*] Replace with `split(..., maxsplit=1)`.
|
Expand All @@ -692,3 +693,173 @@ missing_maxsplit_arg.py:184:1: PLC0207 [*] Replace with `split(..., maxsplit=1)`
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
185 185 |
186 186 |
187 187 | ## Test unpacked list literal args (starred expressions)

missing_maxsplit_arg.py:189:1: PLC0207 [*] Replace with `split(..., maxsplit=1)`.
|
187 | ## Test unpacked list literal args (starred expressions)
188 | # Errors
189 | "1,2,3".split(",", *[-1])[0]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLC0207
190 | "1,2,3".split(",", *[1])[0]
191 | "1,2,3".rsplit(",", *[-1])[-1]
|
= help: Pass `maxsplit=1` into `str.split()`

ℹ Unsafe fix
186 186 |
187 187 | ## Test unpacked list literal args (starred expressions)
188 188 | # Errors
189 |-"1,2,3".split(",", *[-1])[0]
189 |+"1,2,3".split(",", *[-1], maxsplit=1)[0]
190 190 | "1,2,3".split(",", *[1])[0]
191 191 | "1,2,3".rsplit(",", *[-1])[-1]
192 192 | "1,2,3".rsplit(",", *[1])[-1]

missing_maxsplit_arg.py:190:1: PLC0207 [*] Replace with `split(..., maxsplit=1)`.
|
188 | # Errors
189 | "1,2,3".split(",", *[-1])[0]
190 | "1,2,3".split(",", *[1])[0]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLC0207
191 | "1,2,3".rsplit(",", *[-1])[-1]
192 | "1,2,3".rsplit(",", *[1])[-1]
|
= help: Pass `maxsplit=1` into `str.split()`

ℹ Unsafe fix
187 187 | ## Test unpacked list literal args (starred expressions)
188 188 | # Errors
189 189 | "1,2,3".split(",", *[-1])[0]
190 |-"1,2,3".split(",", *[1])[0]
190 |+"1,2,3".split(",", *[1], maxsplit=1)[0]
191 191 | "1,2,3".rsplit(",", *[-1])[-1]
192 192 | "1,2,3".rsplit(",", *[1])[-1]
193 193 |

missing_maxsplit_arg.py:191:1: PLC0207 [*] Replace with `rsplit(..., maxsplit=1)`.
|
189 | "1,2,3".split(",", *[-1])[0]
190 | "1,2,3".split(",", *[1])[0]
191 | "1,2,3".rsplit(",", *[-1])[-1]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLC0207
192 | "1,2,3".rsplit(",", *[1])[-1]
|
= help: Pass `maxsplit=1` into `str.rsplit()`

ℹ Unsafe fix
188 188 | # Errors
189 189 | "1,2,3".split(",", *[-1])[0]
190 190 | "1,2,3".split(",", *[1])[0]
191 |-"1,2,3".rsplit(",", *[-1])[-1]
191 |+"1,2,3".rsplit(",", *[-1], maxsplit=1)[-1]
192 192 | "1,2,3".rsplit(",", *[1])[-1]
193 193 |
194 194 | ## Test unpacked list variable args

missing_maxsplit_arg.py:192:1: PLC0207 [*] Replace with `rsplit(..., maxsplit=1)`.
|
190 | "1,2,3".split(",", *[1])[0]
191 | "1,2,3".rsplit(",", *[-1])[-1]
192 | "1,2,3".rsplit(",", *[1])[-1]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLC0207
193 |
194 | ## Test unpacked list variable args
|
= help: Pass `maxsplit=1` into `str.rsplit()`

ℹ Unsafe fix
189 189 | "1,2,3".split(",", *[-1])[0]
190 190 | "1,2,3".split(",", *[1])[0]
191 191 | "1,2,3".rsplit(",", *[-1])[-1]
192 |-"1,2,3".rsplit(",", *[1])[-1]
192 |+"1,2,3".rsplit(",", *[1], maxsplit=1)[-1]
193 193 |
194 194 | ## Test unpacked list variable args
195 195 | # Errors

missing_maxsplit_arg.py:197:1: PLC0207 [*] Replace with `split(..., maxsplit=1)`.
|
195 | # Errors
196 | args_list = [-1]
197 | "1,2,3".split(",", *args_list)[0]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLC0207
198 | args_list = [1]
199 | "1,2,3".split(",", *args_list)[0]
|
= help: Pass `maxsplit=1` into `str.split()`

ℹ Unsafe fix
194 194 | ## Test unpacked list variable args
195 195 | # Errors
196 196 | args_list = [-1]
197 |-"1,2,3".split(",", *args_list)[0]
197 |+"1,2,3".split(",", *args_list, maxsplit=1)[0]
198 198 | args_list = [1]
199 199 | "1,2,3".split(",", *args_list)[0]
200 200 | args_list = [-1]

missing_maxsplit_arg.py:199:1: PLC0207 [*] Replace with `split(..., maxsplit=1)`.
|
197 | "1,2,3".split(",", *args_list)[0]
198 | args_list = [1]
199 | "1,2,3".split(",", *args_list)[0]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLC0207
200 | args_list = [-1]
201 | "1,2,3".rsplit(",", *args_list)[-1]
|
= help: Pass `maxsplit=1` into `str.split()`

ℹ Unsafe fix
196 196 | args_list = [-1]
197 197 | "1,2,3".split(",", *args_list)[0]
198 198 | args_list = [1]
199 |-"1,2,3".split(",", *args_list)[0]
199 |+"1,2,3".split(",", *args_list, maxsplit=1)[0]
200 200 | args_list = [-1]
201 201 | "1,2,3".rsplit(",", *args_list)[-1]
202 202 | args_list = [1]

missing_maxsplit_arg.py:201:1: PLC0207 [*] Replace with `rsplit(..., maxsplit=1)`.
|
199 | "1,2,3".split(",", *args_list)[0]
200 | args_list = [-1]
201 | "1,2,3".rsplit(",", *args_list)[-1]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLC0207
202 | args_list = [1]
203 | "1,2,3".rsplit(",", *args_list)[-1]
|
= help: Pass `maxsplit=1` into `str.rsplit()`

ℹ Unsafe fix
198 198 | args_list = [1]
199 199 | "1,2,3".split(",", *args_list)[0]
200 200 | args_list = [-1]
201 |-"1,2,3".rsplit(",", *args_list)[-1]
201 |+"1,2,3".rsplit(",", *args_list, maxsplit=1)[-1]
202 202 | args_list = [1]
203 203 | "1,2,3".rsplit(",", *args_list)[-1]
204 204 |

missing_maxsplit_arg.py:203:1: PLC0207 [*] Replace with `rsplit(..., maxsplit=1)`.
|
201 | "1,2,3".rsplit(",", *args_list)[-1]
202 | args_list = [1]
203 | "1,2,3".rsplit(",", *args_list)[-1]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLC0207
204 |
205 | ## Test mixed unpacked args and kwargs
|
= help: Pass `maxsplit=1` into `str.rsplit()`

ℹ Unsafe fix
200 200 | args_list = [-1]
201 201 | "1,2,3".rsplit(",", *args_list)[-1]
202 202 | args_list = [1]
203 |-"1,2,3".rsplit(",", *args_list)[-1]
203 |+"1,2,3".rsplit(",", *args_list, maxsplit=1)[-1]
204 204 |
205 205 | ## Test mixed unpacked args and kwargs
206 206 | # Errors
Loading