Skip to content

Commit

Permalink
Mark FURB118 fix as unsafe (#13613)
Browse files Browse the repository at this point in the history
Closes #13421
  • Loading branch information
zanieb authored Oct 3, 2024
1 parent 7ad07c2 commit 99e4566
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 43 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,14 @@ use crate::checkers::ast::Checker;
use crate::importer::{ImportRequest, Importer};

/// ## What it does
/// Checks for lambda expressions and function definitions that can be replaced
/// with a function from the `operator` module.
/// Checks for lambda expressions and function definitions that can be replaced with a function from
/// the `operator` module.
///
/// ## Why is this bad?
/// The `operator` module provides functions that implement the same functionality
/// as the corresponding operators. For example, `operator.add` is equivalent to
/// `lambda x, y: x + y`. Using the functions from the `operator` module is more
/// concise and communicates the intent of the code more clearly.
/// The `operator` module provides functions that implement the same functionality as the
/// corresponding operators. For example, `operator.add` is equivalent to `lambda x, y: x + y`.
/// Using the functions from the `operator` module is more concise and communicates the intent of
/// the code more clearly.
///
/// ## Example
/// ```python
Expand All @@ -42,6 +42,12 @@ use crate::importer::{ImportRequest, Importer};
/// nums = [1, 2, 3]
/// total = functools.reduce(operator.add, nums)
/// ```
///
/// ## Fix safety
/// This fix is usually safe, but if the lambda is called with keyword arguments, e.g.,
/// `add = lambda x, y: x + y; add(x=1, y=2)`, replacing the lambda with an operator function, e.g.,
/// `operator.add`, will cause the call to raise a `TypeError`, as functions in `operator` do not allow
/// keyword arguments.
#[violation]
pub struct ReimplementedOperator {
operator: Operator,
Expand Down Expand Up @@ -177,7 +183,7 @@ impl FunctionLike<'_> {
} else {
format!("{binding}({})", operator.args.join(", "))
};
Ok(Some(Fix::safe_edits(
Ok(Some(Fix::unsafe_edits(
Edit::range_replacement(content, self.range()),
[edit],
)))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ FURB118.py:2:13: FURB118 [*] Use `operator.invert` instead of defining a lambda
|
= help: Replace with `operator.invert`

Safe fix
Unsafe fix
1 1 | # Errors.
2 |-op_bitnot = lambda x: ~x
2 |+import operator
Expand All @@ -31,7 +31,7 @@ FURB118.py:3:10: FURB118 [*] Use `operator.not_` instead of defining a lambda
|
= help: Replace with `operator.not_`

Safe fix
Unsafe fix
1 1 | # Errors.
2 |+import operator
2 3 | op_bitnot = lambda x: ~x
Expand All @@ -51,7 +51,7 @@ FURB118.py:4:10: FURB118 [*] Use `operator.pos` instead of defining a lambda
|
= help: Replace with `operator.pos`

Safe fix
Unsafe fix
1 1 | # Errors.
2 |+import operator
2 3 | op_bitnot = lambda x: ~x
Expand All @@ -73,7 +73,7 @@ FURB118.py:5:10: FURB118 [*] Use `operator.neg` instead of defining a lambda
|
= help: Replace with `operator.neg`

Safe fix
Unsafe fix
1 1 | # Errors.
2 |+import operator
2 3 | op_bitnot = lambda x: ~x
Expand All @@ -96,7 +96,7 @@ FURB118.py:7:10: FURB118 [*] Use `operator.add` instead of defining a lambda
|
= help: Replace with `operator.add`

Safe fix
Unsafe fix
1 1 | # Errors.
2 |+import operator
2 3 | op_bitnot = lambda x: ~x
Expand All @@ -120,7 +120,7 @@ FURB118.py:8:10: FURB118 [*] Use `operator.sub` instead of defining a lambda
|
= help: Replace with `operator.sub`

Safe fix
Unsafe fix
1 1 | # Errors.
2 |+import operator
2 3 | op_bitnot = lambda x: ~x
Expand All @@ -146,7 +146,7 @@ FURB118.py:9:11: FURB118 [*] Use `operator.mul` instead of defining a lambda
|
= help: Replace with `operator.mul`

Safe fix
Unsafe fix
1 1 | # Errors.
2 |+import operator
2 3 | op_bitnot = lambda x: ~x
Expand All @@ -173,7 +173,7 @@ FURB118.py:10:14: FURB118 [*] Use `operator.matmul` instead of defining a lambda
|
= help: Replace with `operator.matmul`

Safe fix
Unsafe fix
1 1 | # Errors.
2 |+import operator
2 3 | op_bitnot = lambda x: ~x
Expand All @@ -200,7 +200,7 @@ FURB118.py:11:14: FURB118 [*] Use `operator.truediv` instead of defining a lambd
|
= help: Replace with `operator.truediv`

Safe fix
Unsafe fix
1 1 | # Errors.
2 |+import operator
2 3 | op_bitnot = lambda x: ~x
Expand All @@ -227,7 +227,7 @@ FURB118.py:12:10: FURB118 [*] Use `operator.mod` instead of defining a lambda
|
= help: Replace with `operator.mod`

Safe fix
Unsafe fix
1 1 | # Errors.
2 |+import operator
2 3 | op_bitnot = lambda x: ~x
Expand All @@ -254,7 +254,7 @@ FURB118.py:13:10: FURB118 [*] Use `operator.pow` instead of defining a lambda
|
= help: Replace with `operator.pow`

Safe fix
Unsafe fix
1 1 | # Errors.
2 |+import operator
2 3 | op_bitnot = lambda x: ~x
Expand All @@ -281,7 +281,7 @@ FURB118.py:14:13: FURB118 [*] Use `operator.lshift` instead of defining a lambda
|
= help: Replace with `operator.lshift`

Safe fix
Unsafe fix
1 1 | # Errors.
2 |+import operator
2 3 | op_bitnot = lambda x: ~x
Expand All @@ -308,7 +308,7 @@ FURB118.py:15:13: FURB118 [*] Use `operator.rshift` instead of defining a lambda
|
= help: Replace with `operator.rshift`

Safe fix
Unsafe fix
1 1 | # Errors.
2 |+import operator
2 3 | op_bitnot = lambda x: ~x
Expand All @@ -335,7 +335,7 @@ FURB118.py:16:12: FURB118 [*] Use `operator.or_` instead of defining a lambda
|
= help: Replace with `operator.or_`

Safe fix
Unsafe fix
1 1 | # Errors.
2 |+import operator
2 3 | op_bitnot = lambda x: ~x
Expand All @@ -362,7 +362,7 @@ FURB118.py:17:10: FURB118 [*] Use `operator.xor` instead of defining a lambda
|
= help: Replace with `operator.xor`

Safe fix
Unsafe fix
1 1 | # Errors.
2 |+import operator
2 3 | op_bitnot = lambda x: ~x
Expand All @@ -388,7 +388,7 @@ FURB118.py:18:13: FURB118 [*] Use `operator.and_` instead of defining a lambda
|
= help: Replace with `operator.and_`

Safe fix
Unsafe fix
1 1 | # Errors.
2 |+import operator
2 3 | op_bitnot = lambda x: ~x
Expand All @@ -415,7 +415,7 @@ FURB118.py:19:15: FURB118 [*] Use `operator.floordiv` instead of defining a lamb
|
= help: Replace with `operator.floordiv`

Safe fix
Unsafe fix
1 1 | # Errors.
2 |+import operator
2 3 | op_bitnot = lambda x: ~x
Expand All @@ -442,7 +442,7 @@ FURB118.py:21:9: FURB118 [*] Use `operator.eq` instead of defining a lambda
|
= help: Replace with `operator.eq`

Safe fix
Unsafe fix
1 1 | # Errors.
2 |+import operator
2 3 | op_bitnot = lambda x: ~x
Expand All @@ -468,7 +468,7 @@ FURB118.py:22:9: FURB118 [*] Use `operator.ne` instead of defining a lambda
|
= help: Replace with `operator.ne`

Safe fix
Unsafe fix
1 1 | # Errors.
2 |+import operator
2 3 | op_bitnot = lambda x: ~x
Expand All @@ -495,7 +495,7 @@ FURB118.py:23:9: FURB118 [*] Use `operator.lt` instead of defining a lambda
|
= help: Replace with `operator.lt`

Safe fix
Unsafe fix
1 1 | # Errors.
2 |+import operator
2 3 | op_bitnot = lambda x: ~x
Expand All @@ -522,7 +522,7 @@ FURB118.py:24:10: FURB118 [*] Use `operator.le` instead of defining a lambda
|
= help: Replace with `operator.le`

Safe fix
Unsafe fix
1 1 | # Errors.
2 |+import operator
2 3 | op_bitnot = lambda x: ~x
Expand All @@ -549,7 +549,7 @@ FURB118.py:25:9: FURB118 [*] Use `operator.gt` instead of defining a lambda
|
= help: Replace with `operator.gt`

Safe fix
Unsafe fix
1 1 | # Errors.
2 |+import operator
2 3 | op_bitnot = lambda x: ~x
Expand All @@ -576,7 +576,7 @@ FURB118.py:26:10: FURB118 [*] Use `operator.ge` instead of defining a lambda
|
= help: Replace with `operator.ge`

Safe fix
Unsafe fix
1 1 | # Errors.
2 |+import operator
2 3 | op_bitnot = lambda x: ~x
Expand All @@ -603,7 +603,7 @@ FURB118.py:27:9: FURB118 [*] Use `operator.is_` instead of defining a lambda
|
= help: Replace with `operator.is_`

Safe fix
Unsafe fix
1 1 | # Errors.
2 |+import operator
2 3 | op_bitnot = lambda x: ~x
Expand All @@ -630,7 +630,7 @@ FURB118.py:28:12: FURB118 [*] Use `operator.is_not` instead of defining a lambda
|
= help: Replace with `operator.is_not`

Safe fix
Unsafe fix
1 1 | # Errors.
2 |+import operator
2 3 | op_bitnot = lambda x: ~x
Expand All @@ -657,7 +657,7 @@ FURB118.py:29:9: FURB118 [*] Use `operator.contains` instead of defining a lambd
|
= help: Replace with `operator.contains`

Safe fix
Unsafe fix
1 1 | # Errors.
2 |+import operator
2 3 | op_bitnot = lambda x: ~x
Expand All @@ -684,7 +684,7 @@ FURB118.py:30:17: FURB118 [*] Use `operator.itemgetter(0)` instead of defining a
|
= help: Replace with `operator.itemgetter(0)`

Safe fix
Unsafe fix
1 1 | # Errors.
2 |+import operator
2 3 | op_bitnot = lambda x: ~x
Expand All @@ -711,7 +711,7 @@ FURB118.py:31:17: FURB118 [*] Use `operator.itemgetter(0, 1, 2)` instead of defi
|
= help: Replace with `operator.itemgetter(0, 1, 2)`

Safe fix
Unsafe fix
1 1 | # Errors.
2 |+import operator
2 3 | op_bitnot = lambda x: ~x
Expand All @@ -738,7 +738,7 @@ FURB118.py:32:17: FURB118 [*] Use `operator.itemgetter(slice(1, None), 2)` inste
|
= help: Replace with `operator.itemgetter(slice(1, None), 2)`

Safe fix
Unsafe fix
1 1 | # Errors.
2 |+import operator
2 3 | op_bitnot = lambda x: ~x
Expand All @@ -765,7 +765,7 @@ FURB118.py:33:17: FURB118 [*] Use `operator.itemgetter(slice(None))` instead of
|
= help: Replace with `operator.itemgetter(slice(None))`

Safe fix
Unsafe fix
1 1 | # Errors.
2 |+import operator
2 3 | op_bitnot = lambda x: ~x
Expand All @@ -791,7 +791,7 @@ FURB118.py:34:17: FURB118 [*] Use `operator.itemgetter((0, 1))` instead of defin
|
= help: Replace with `operator.itemgetter((0, 1))`

Safe fix
Unsafe fix
1 1 | # Errors.
2 |+import operator
2 3 | op_bitnot = lambda x: ~x
Expand All @@ -816,7 +816,7 @@ FURB118.py:35:17: FURB118 [*] Use `operator.itemgetter((0, 1))` instead of defin
|
= help: Replace with `operator.itemgetter((0, 1))`

Safe fix
Unsafe fix
1 1 | # Errors.
2 |+import operator
2 3 | op_bitnot = lambda x: ~x
Expand Down Expand Up @@ -857,7 +857,7 @@ FURB118.py:88:17: FURB118 [*] Use `operator.itemgetter((slice(None), 1))` instea
|
= help: Replace with `operator.itemgetter((slice(None), 1))`

Safe fix
Unsafe fix
1 1 | # Errors.
2 |+import operator
2 3 | op_bitnot = lambda x: ~x
Expand All @@ -884,7 +884,7 @@ FURB118.py:89:17: FURB118 [*] Use `operator.itemgetter((1, slice(None)))` instea
|
= help: Replace with `operator.itemgetter((1, slice(None)))`

Safe fix
Unsafe fix
1 1 | # Errors.
2 |+import operator
2 3 | op_bitnot = lambda x: ~x
Expand All @@ -910,7 +910,7 @@ FURB118.py:92:17: FURB118 [*] Use `operator.itemgetter((1, slice(None)))` instea
|
= help: Replace with `operator.itemgetter((1, slice(None)))`

Safe fix
Unsafe fix
1 1 | # Errors.
2 |+import operator
2 3 | op_bitnot = lambda x: ~x
Expand All @@ -934,7 +934,7 @@ FURB118.py:95:17: FURB118 [*] Use `operator.itemgetter((1, 2))` instead
|
= help: Replace with `operator.itemgetter((1, 2))`

Safe fix
Unsafe fix
1 1 | # Errors.
2 |+import operator
2 3 | op_bitnot = lambda x: ~x
Expand Down

0 comments on commit 99e4566

Please sign in to comment.