From 0a42887399de093652d6e0c4de0e55564e88ad12 Mon Sep 17 00:00:00 2001 From: Claudio Jolowicz Date: Sat, 21 Oct 2023 17:09:49 +0200 Subject: [PATCH 1/2] Upgrade mutable-argument-defaults to unsafe --- .../rules/mutable_argument_default.rs | 2 +- ...flake8_bugbear__tests__B006_B006_1.py.snap | 4 +- ...flake8_bugbear__tests__B006_B006_2.py.snap | 4 +- ...flake8_bugbear__tests__B006_B006_3.py.snap | 4 +- ...flake8_bugbear__tests__B006_B006_4.py.snap | 4 +- ...flake8_bugbear__tests__B006_B006_5.py.snap | 52 +++++------ ...flake8_bugbear__tests__B006_B006_6.py.snap | 4 +- ...flake8_bugbear__tests__B006_B006_7.py.snap | 4 +- ...ke8_bugbear__tests__B006_B006_B008.py.snap | 92 +++++++++---------- ...extend_immutable_calls_arg_annotation.snap | 4 +- 10 files changed, 87 insertions(+), 87 deletions(-) diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/mutable_argument_default.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/mutable_argument_default.rs index 7e4f8a6d5b1aa..e0208b472a7e3 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/mutable_argument_default.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/mutable_argument_default.rs @@ -197,5 +197,5 @@ fn move_initialization( } let initialization_edit = Edit::insertion(content, pos); - Some(Fix::display_edits(default_edit, [initialization_edit])) + Some(Fix::unsafe_edits(default_edit, [initialization_edit])) } diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/snapshots/ruff_linter__rules__flake8_bugbear__tests__B006_B006_1.py.snap b/crates/ruff_linter/src/rules/flake8_bugbear/snapshots/ruff_linter__rules__flake8_bugbear__tests__B006_B006_1.py.snap index 35b0a379d0b5b..aa5ecfb3f14d4 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/snapshots/ruff_linter__rules__flake8_bugbear__tests__B006_B006_1.py.snap +++ b/crates/ruff_linter/src/rules/flake8_bugbear/snapshots/ruff_linter__rules__flake8_bugbear__tests__B006_B006_1.py.snap @@ -1,7 +1,7 @@ --- source: crates/ruff_linter/src/rules/flake8_bugbear/mod.rs --- -B006_1.py:3:22: B006 Do not use mutable data structures for argument defaults +B006_1.py:3:22: B006 [*] Do not use mutable data structures for argument defaults | 1 | # Docstring followed by a newline 2 | @@ -12,7 +12,7 @@ B006_1.py:3:22: B006 Do not use mutable data structures for argument defaults | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 1 1 | # Docstring followed by a newline 2 2 | 3 |-def foobar(foor, bar={}): diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/snapshots/ruff_linter__rules__flake8_bugbear__tests__B006_B006_2.py.snap b/crates/ruff_linter/src/rules/flake8_bugbear/snapshots/ruff_linter__rules__flake8_bugbear__tests__B006_B006_2.py.snap index c925bc5c88a8a..f37779627eff2 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/snapshots/ruff_linter__rules__flake8_bugbear__tests__B006_B006_2.py.snap +++ b/crates/ruff_linter/src/rules/flake8_bugbear/snapshots/ruff_linter__rules__flake8_bugbear__tests__B006_B006_2.py.snap @@ -1,7 +1,7 @@ --- source: crates/ruff_linter/src/rules/flake8_bugbear/mod.rs --- -B006_2.py:4:22: B006 Do not use mutable data structures for argument defaults +B006_2.py:4:22: B006 [*] Do not use mutable data structures for argument defaults | 2 | # Regression test for https://github.com/astral-sh/ruff/issues/7155 3 | @@ -12,7 +12,7 @@ B006_2.py:4:22: B006 Do not use mutable data structures for argument defaults | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 1 1 | # Docstring followed by whitespace with no newline 2 2 | # Regression test for https://github.com/astral-sh/ruff/issues/7155 3 3 | diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/snapshots/ruff_linter__rules__flake8_bugbear__tests__B006_B006_3.py.snap b/crates/ruff_linter/src/rules/flake8_bugbear/snapshots/ruff_linter__rules__flake8_bugbear__tests__B006_B006_3.py.snap index 2c821d5416561..2013a5d199eff 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/snapshots/ruff_linter__rules__flake8_bugbear__tests__B006_B006_3.py.snap +++ b/crates/ruff_linter/src/rules/flake8_bugbear/snapshots/ruff_linter__rules__flake8_bugbear__tests__B006_B006_3.py.snap @@ -1,7 +1,7 @@ --- source: crates/ruff_linter/src/rules/flake8_bugbear/mod.rs --- -B006_3.py:4:22: B006 Do not use mutable data structures for argument defaults +B006_3.py:4:22: B006 [*] Do not use mutable data structures for argument defaults | 4 | def foobar(foor, bar={}): | ^^ B006 @@ -10,7 +10,7 @@ B006_3.py:4:22: B006 Do not use mutable data structures for argument defaults | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 1 1 | # Docstring with no newline 2 2 | 3 3 | diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/snapshots/ruff_linter__rules__flake8_bugbear__tests__B006_B006_4.py.snap b/crates/ruff_linter/src/rules/flake8_bugbear/snapshots/ruff_linter__rules__flake8_bugbear__tests__B006_B006_4.py.snap index bc73ff2c98b22..59188b0678d9d 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/snapshots/ruff_linter__rules__flake8_bugbear__tests__B006_B006_4.py.snap +++ b/crates/ruff_linter/src/rules/flake8_bugbear/snapshots/ruff_linter__rules__flake8_bugbear__tests__B006_B006_4.py.snap @@ -1,7 +1,7 @@ --- source: crates/ruff_linter/src/rules/flake8_bugbear/mod.rs --- -B006_4.py:7:26: B006 Do not use mutable data structures for argument defaults +B006_4.py:7:26: B006 [*] Do not use mutable data structures for argument defaults | 6 | class FormFeedIndent: 7 | def __init__(self, a=[]): @@ -10,7 +10,7 @@ B006_4.py:7:26: B006 Do not use mutable data structures for argument defaults | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 4 4 | 5 5 | 6 6 | class FormFeedIndent: diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/snapshots/ruff_linter__rules__flake8_bugbear__tests__B006_B006_5.py.snap b/crates/ruff_linter/src/rules/flake8_bugbear/snapshots/ruff_linter__rules__flake8_bugbear__tests__B006_B006_5.py.snap index 85fce0a188420..bea5f44bb4e74 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/snapshots/ruff_linter__rules__flake8_bugbear__tests__B006_B006_5.py.snap +++ b/crates/ruff_linter/src/rules/flake8_bugbear/snapshots/ruff_linter__rules__flake8_bugbear__tests__B006_B006_5.py.snap @@ -1,7 +1,7 @@ --- source: crates/ruff_linter/src/rules/flake8_bugbear/mod.rs --- -B006_5.py:5:49: B006 Do not use mutable data structures for argument defaults +B006_5.py:5:49: B006 [*] Do not use mutable data structures for argument defaults | 5 | def import_module_wrong(value: dict[str, str] = {}): | ^^ B006 @@ -9,7 +9,7 @@ B006_5.py:5:49: B006 Do not use mutable data structures for argument defaults | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 2 2 | # https://github.com/astral-sh/ruff/issues/7616 3 3 | 4 4 | @@ -22,7 +22,7 @@ B006_5.py:5:49: B006 Do not use mutable data structures for argument defaults 8 10 | 9 11 | def import_module_with_values_wrong(value: dict[str, str] = {}): -B006_5.py:9:61: B006 Do not use mutable data structures for argument defaults +B006_5.py:9:61: B006 [*] Do not use mutable data structures for argument defaults | 9 | def import_module_with_values_wrong(value: dict[str, str] = {}): | ^^ B006 @@ -30,7 +30,7 @@ B006_5.py:9:61: B006 Do not use mutable data structures for argument defaults | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 6 6 | import os 7 7 | 8 8 | @@ -44,7 +44,7 @@ B006_5.py:9:61: B006 Do not use mutable data structures for argument defaults 13 15 | 14 16 | -B006_5.py:15:50: B006 Do not use mutable data structures for argument defaults +B006_5.py:15:50: B006 [*] Do not use mutable data structures for argument defaults | 15 | def import_modules_wrong(value: dict[str, str] = {}): | ^^ B006 @@ -53,7 +53,7 @@ B006_5.py:15:50: B006 Do not use mutable data structures for argument defaults | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 12 12 | return 2 13 13 | 14 14 | @@ -68,7 +68,7 @@ B006_5.py:15:50: B006 Do not use mutable data structures for argument defaults 20 22 | 21 23 | def from_import_module_wrong(value: dict[str, str] = {}): -B006_5.py:21:54: B006 Do not use mutable data structures for argument defaults +B006_5.py:21:54: B006 [*] Do not use mutable data structures for argument defaults | 21 | def from_import_module_wrong(value: dict[str, str] = {}): | ^^ B006 @@ -76,7 +76,7 @@ B006_5.py:21:54: B006 Do not use mutable data structures for argument defaults | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 18 18 | import itertools 19 19 | 20 20 | @@ -89,7 +89,7 @@ B006_5.py:21:54: B006 Do not use mutable data structures for argument defaults 24 26 | 25 27 | def from_imports_module_wrong(value: dict[str, str] = {}): -B006_5.py:25:55: B006 Do not use mutable data structures for argument defaults +B006_5.py:25:55: B006 [*] Do not use mutable data structures for argument defaults | 25 | def from_imports_module_wrong(value: dict[str, str] = {}): | ^^ B006 @@ -98,7 +98,7 @@ B006_5.py:25:55: B006 Do not use mutable data structures for argument defaults | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 22 22 | from os import path 23 23 | 24 24 | @@ -112,7 +112,7 @@ B006_5.py:25:55: B006 Do not use mutable data structures for argument defaults 29 31 | 30 32 | def import_and_from_imports_module_wrong(value: dict[str, str] = {}): -B006_5.py:30:66: B006 Do not use mutable data structures for argument defaults +B006_5.py:30:66: B006 [*] Do not use mutable data structures for argument defaults | 30 | def import_and_from_imports_module_wrong(value: dict[str, str] = {}): | ^^ B006 @@ -121,7 +121,7 @@ B006_5.py:30:66: B006 Do not use mutable data structures for argument defaults | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 27 27 | from sys import version_info 28 28 | 29 29 | @@ -135,7 +135,7 @@ B006_5.py:30:66: B006 Do not use mutable data structures for argument defaults 34 36 | 35 37 | def import_docstring_module_wrong(value: dict[str, str] = {}): -B006_5.py:35:59: B006 Do not use mutable data structures for argument defaults +B006_5.py:35:59: B006 [*] Do not use mutable data structures for argument defaults | 35 | def import_docstring_module_wrong(value: dict[str, str] = {}): | ^^ B006 @@ -144,7 +144,7 @@ B006_5.py:35:59: B006 Do not use mutable data structures for argument defaults | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 32 32 | from sys import version_info 33 33 | 34 34 | @@ -158,7 +158,7 @@ B006_5.py:35:59: B006 Do not use mutable data structures for argument defaults 39 41 | 40 42 | def import_module_wrong(value: dict[str, str] = {}): -B006_5.py:40:49: B006 Do not use mutable data structures for argument defaults +B006_5.py:40:49: B006 [*] Do not use mutable data structures for argument defaults | 40 | def import_module_wrong(value: dict[str, str] = {}): | ^^ B006 @@ -167,7 +167,7 @@ B006_5.py:40:49: B006 Do not use mutable data structures for argument defaults | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 37 37 | import os 38 38 | 39 39 | @@ -181,7 +181,7 @@ B006_5.py:40:49: B006 Do not use mutable data structures for argument defaults 44 46 | 45 47 | def import_module_wrong(value: dict[str, str] = {}): -B006_5.py:45:49: B006 Do not use mutable data structures for argument defaults +B006_5.py:45:49: B006 [*] Do not use mutable data structures for argument defaults | 45 | def import_module_wrong(value: dict[str, str] = {}): | ^^ B006 @@ -190,7 +190,7 @@ B006_5.py:45:49: B006 Do not use mutable data structures for argument defaults | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 42 42 | import os; import sys 43 43 | 44 44 | @@ -203,7 +203,7 @@ B006_5.py:45:49: B006 Do not use mutable data structures for argument defaults 48 50 | 49 51 | -B006_5.py:50:49: B006 Do not use mutable data structures for argument defaults +B006_5.py:50:49: B006 [*] Do not use mutable data structures for argument defaults | 50 | def import_module_wrong(value: dict[str, str] = {}): | ^^ B006 @@ -212,7 +212,7 @@ B006_5.py:50:49: B006 Do not use mutable data structures for argument defaults | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 47 47 | import os; import sys; x = 1 48 48 | 49 49 | @@ -226,7 +226,7 @@ B006_5.py:50:49: B006 Do not use mutable data structures for argument defaults 54 56 | 55 57 | def import_module_wrong(value: dict[str, str] = {}): -B006_5.py:55:49: B006 Do not use mutable data structures for argument defaults +B006_5.py:55:49: B006 [*] Do not use mutable data structures for argument defaults | 55 | def import_module_wrong(value: dict[str, str] = {}): | ^^ B006 @@ -234,7 +234,7 @@ B006_5.py:55:49: B006 Do not use mutable data structures for argument defaults | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 52 52 | import os; import sys 53 53 | 54 54 | @@ -247,7 +247,7 @@ B006_5.py:55:49: B006 Do not use mutable data structures for argument defaults 58 60 | 59 61 | def import_module_wrong(value: dict[str, str] = {}): -B006_5.py:59:49: B006 Do not use mutable data structures for argument defaults +B006_5.py:59:49: B006 [*] Do not use mutable data structures for argument defaults | 59 | def import_module_wrong(value: dict[str, str] = {}): | ^^ B006 @@ -255,7 +255,7 @@ B006_5.py:59:49: B006 Do not use mutable data structures for argument defaults | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 56 56 | import os; import sys 57 57 | 58 58 | @@ -267,7 +267,7 @@ B006_5.py:59:49: B006 Do not use mutable data structures for argument defaults 61 63 | 62 64 | -B006_5.py:63:49: B006 Do not use mutable data structures for argument defaults +B006_5.py:63:49: B006 [*] Do not use mutable data structures for argument defaults | 63 | def import_module_wrong(value: dict[str, str] = {}): | ^^ B006 @@ -275,7 +275,7 @@ B006_5.py:63:49: B006 Do not use mutable data structures for argument defaults | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 60 60 | import os; import sys; x = 1 61 61 | 62 62 | diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/snapshots/ruff_linter__rules__flake8_bugbear__tests__B006_B006_6.py.snap b/crates/ruff_linter/src/rules/flake8_bugbear/snapshots/ruff_linter__rules__flake8_bugbear__tests__B006_B006_6.py.snap index f858253ec8d07..be764fc13791e 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/snapshots/ruff_linter__rules__flake8_bugbear__tests__B006_B006_6.py.snap +++ b/crates/ruff_linter/src/rules/flake8_bugbear/snapshots/ruff_linter__rules__flake8_bugbear__tests__B006_B006_6.py.snap @@ -1,7 +1,7 @@ --- source: crates/ruff_linter/src/rules/flake8_bugbear/mod.rs --- -B006_6.py:4:22: B006 Do not use mutable data structures for argument defaults +B006_6.py:4:22: B006 [*] Do not use mutable data structures for argument defaults | 2 | # Same as B006_2.py, but import instead of docstring 3 | @@ -11,7 +11,7 @@ B006_6.py:4:22: B006 Do not use mutable data structures for argument defaults | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 1 1 | # Import followed by whitespace with no newline 2 2 | # Same as B006_2.py, but import instead of docstring 3 3 | diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/snapshots/ruff_linter__rules__flake8_bugbear__tests__B006_B006_7.py.snap b/crates/ruff_linter/src/rules/flake8_bugbear/snapshots/ruff_linter__rules__flake8_bugbear__tests__B006_B006_7.py.snap index b5418395f5505..39599123bd8be 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/snapshots/ruff_linter__rules__flake8_bugbear__tests__B006_B006_7.py.snap +++ b/crates/ruff_linter/src/rules/flake8_bugbear/snapshots/ruff_linter__rules__flake8_bugbear__tests__B006_B006_7.py.snap @@ -1,7 +1,7 @@ --- source: crates/ruff_linter/src/rules/flake8_bugbear/mod.rs --- -B006_7.py:4:22: B006 Do not use mutable data structures for argument defaults +B006_7.py:4:22: B006 [*] Do not use mutable data structures for argument defaults | 2 | # Same as B006_3.py, but import instead of docstring 3 | @@ -11,7 +11,7 @@ B006_7.py:4:22: B006 Do not use mutable data structures for argument defaults | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 1 1 | # Import with no newline 2 2 | # Same as B006_3.py, but import instead of docstring 3 3 | diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/snapshots/ruff_linter__rules__flake8_bugbear__tests__B006_B006_B008.py.snap b/crates/ruff_linter/src/rules/flake8_bugbear/snapshots/ruff_linter__rules__flake8_bugbear__tests__B006_B006_B008.py.snap index 2f8e3285bb24a..1f5f6764a6996 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/snapshots/ruff_linter__rules__flake8_bugbear__tests__B006_B006_B008.py.snap +++ b/crates/ruff_linter/src/rules/flake8_bugbear/snapshots/ruff_linter__rules__flake8_bugbear__tests__B006_B006_B008.py.snap @@ -1,7 +1,7 @@ --- source: crates/ruff_linter/src/rules/flake8_bugbear/mod.rs --- -B006_B008.py:63:25: B006 Do not use mutable data structures for argument defaults +B006_B008.py:63:25: B006 [*] Do not use mutable data structures for argument defaults | 63 | def this_is_wrong(value=[1, 2, 3]): | ^^^^^^^^^ B006 @@ -9,7 +9,7 @@ B006_B008.py:63:25: B006 Do not use mutable data structures for argument default | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 60 60 | # Flag mutable literals/comprehensions 61 61 | 62 62 | @@ -21,7 +21,7 @@ B006_B008.py:63:25: B006 Do not use mutable data structures for argument default 65 67 | 66 68 | -B006_B008.py:67:30: B006 Do not use mutable data structures for argument defaults +B006_B008.py:67:30: B006 [*] Do not use mutable data structures for argument defaults | 67 | def this_is_also_wrong(value={}): | ^^ B006 @@ -29,7 +29,7 @@ B006_B008.py:67:30: B006 Do not use mutable data structures for argument default | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 64 64 | ... 65 65 | 66 66 | @@ -41,7 +41,7 @@ B006_B008.py:67:30: B006 Do not use mutable data structures for argument default 69 71 | 70 72 | -B006_B008.py:73:52: B006 Do not use mutable data structures for argument defaults +B006_B008.py:73:52: B006 [*] Do not use mutable data structures for argument defaults | 71 | class Foo: 72 | @staticmethod @@ -51,7 +51,7 @@ B006_B008.py:73:52: B006 Do not use mutable data structures for argument default | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 70 70 | 71 71 | class Foo: 72 72 | @staticmethod @@ -63,7 +63,7 @@ B006_B008.py:73:52: B006 Do not use mutable data structures for argument default 75 77 | 76 78 | -B006_B008.py:77:31: B006 Do not use mutable data structures for argument defaults +B006_B008.py:77:31: B006 [*] Do not use mutable data structures for argument defaults | 77 | def multiline_arg_wrong(value={ | _______________________________^ @@ -74,7 +74,7 @@ B006_B008.py:77:31: B006 Do not use mutable data structures for argument default | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 74 74 | pass 75 75 | 76 76 | @@ -97,7 +97,7 @@ B006_B008.py:82:36: B006 Do not use mutable data structures for argument default | = help: Replace with `None`; initialize within function -B006_B008.py:85:20: B006 Do not use mutable data structures for argument defaults +B006_B008.py:85:20: B006 [*] Do not use mutable data structures for argument defaults | 85 | def and_this(value=set()): | ^^^^^ B006 @@ -105,7 +105,7 @@ B006_B008.py:85:20: B006 Do not use mutable data structures for argument default | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 82 82 | def single_line_func_wrong(value = {}): ... 83 83 | 84 84 | @@ -117,7 +117,7 @@ B006_B008.py:85:20: B006 Do not use mutable data structures for argument default 87 89 | 88 90 | -B006_B008.py:89:20: B006 Do not use mutable data structures for argument defaults +B006_B008.py:89:20: B006 [*] Do not use mutable data structures for argument defaults | 89 | def this_too(value=collections.OrderedDict()): | ^^^^^^^^^^^^^^^^^^^^^^^^^ B006 @@ -125,7 +125,7 @@ B006_B008.py:89:20: B006 Do not use mutable data structures for argument default | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 86 86 | ... 87 87 | 88 88 | @@ -137,7 +137,7 @@ B006_B008.py:89:20: B006 Do not use mutable data structures for argument default 91 93 | 92 94 | -B006_B008.py:93:32: B006 Do not use mutable data structures for argument defaults +B006_B008.py:93:32: B006 [*] Do not use mutable data structures for argument defaults | 93 | async def async_this_too(value=collections.defaultdict()): | ^^^^^^^^^^^^^^^^^^^^^^^^^ B006 @@ -145,7 +145,7 @@ B006_B008.py:93:32: B006 Do not use mutable data structures for argument default | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 90 90 | ... 91 91 | 92 92 | @@ -157,7 +157,7 @@ B006_B008.py:93:32: B006 Do not use mutable data structures for argument default 95 97 | 96 98 | -B006_B008.py:97:26: B006 Do not use mutable data structures for argument defaults +B006_B008.py:97:26: B006 [*] Do not use mutable data structures for argument defaults | 97 | def dont_forget_me(value=collections.deque()): | ^^^^^^^^^^^^^^^^^^^ B006 @@ -165,7 +165,7 @@ B006_B008.py:97:26: B006 Do not use mutable data structures for argument default | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 94 94 | ... 95 95 | 96 96 | @@ -177,7 +177,7 @@ B006_B008.py:97:26: B006 Do not use mutable data structures for argument default 99 101 | 100 102 | -B006_B008.py:102:46: B006 Do not use mutable data structures for argument defaults +B006_B008.py:102:46: B006 [*] Do not use mutable data structures for argument defaults | 101 | # N.B. we're also flagging the function call in the comprehension 102 | def list_comprehension_also_not_okay(default=[i**2 for i in range(3)]): @@ -186,7 +186,7 @@ B006_B008.py:102:46: B006 Do not use mutable data structures for argument defaul | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 99 99 | 100 100 | 101 101 | # N.B. we're also flagging the function call in the comprehension @@ -198,7 +198,7 @@ B006_B008.py:102:46: B006 Do not use mutable data structures for argument defaul 104 106 | 105 107 | -B006_B008.py:106:46: B006 Do not use mutable data structures for argument defaults +B006_B008.py:106:46: B006 [*] Do not use mutable data structures for argument defaults | 106 | def dict_comprehension_also_not_okay(default={i: i**2 for i in range(3)}): | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ B006 @@ -206,7 +206,7 @@ B006_B008.py:106:46: B006 Do not use mutable data structures for argument defaul | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 103 103 | pass 104 104 | 105 105 | @@ -218,7 +218,7 @@ B006_B008.py:106:46: B006 Do not use mutable data structures for argument defaul 108 110 | 109 111 | -B006_B008.py:110:45: B006 Do not use mutable data structures for argument defaults +B006_B008.py:110:45: B006 [*] Do not use mutable data structures for argument defaults | 110 | def set_comprehension_also_not_okay(default={i**2 for i in range(3)}): | ^^^^^^^^^^^^^^^^^^^^^^^^ B006 @@ -226,7 +226,7 @@ B006_B008.py:110:45: B006 Do not use mutable data structures for argument defaul | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 107 107 | pass 108 108 | 109 109 | @@ -238,7 +238,7 @@ B006_B008.py:110:45: B006 Do not use mutable data structures for argument defaul 112 114 | 113 115 | -B006_B008.py:114:33: B006 Do not use mutable data structures for argument defaults +B006_B008.py:114:33: B006 [*] Do not use mutable data structures for argument defaults | 114 | def kwonlyargs_mutable(*, value=[]): | ^^ B006 @@ -246,7 +246,7 @@ B006_B008.py:114:33: B006 Do not use mutable data structures for argument defaul | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 111 111 | pass 112 112 | 113 113 | @@ -258,7 +258,7 @@ B006_B008.py:114:33: B006 Do not use mutable data structures for argument defaul 116 118 | 117 119 | -B006_B008.py:239:20: B006 Do not use mutable data structures for argument defaults +B006_B008.py:239:20: B006 [*] Do not use mutable data structures for argument defaults | 237 | # B006 and B008 238 | # We should handle arbitrary nesting of these B008. @@ -268,7 +268,7 @@ B006_B008.py:239:20: B006 Do not use mutable data structures for argument defaul | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 236 236 | 237 237 | # B006 and B008 238 238 | # We should handle arbitrary nesting of these B008. @@ -280,7 +280,7 @@ B006_B008.py:239:20: B006 Do not use mutable data structures for argument defaul 241 243 | 242 244 | -B006_B008.py:276:27: B006 Do not use mutable data structures for argument defaults +B006_B008.py:276:27: B006 [*] Do not use mutable data structures for argument defaults | 275 | def mutable_annotations( 276 | a: list[int] | None = [], @@ -290,7 +290,7 @@ B006_B008.py:276:27: B006 Do not use mutable data structures for argument defaul | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 273 273 | 274 274 | 275 275 | def mutable_annotations( @@ -306,7 +306,7 @@ B006_B008.py:276:27: B006 Do not use mutable data structures for argument defaul 282 284 | 283 285 | -B006_B008.py:277:35: B006 Do not use mutable data structures for argument defaults +B006_B008.py:277:35: B006 [*] Do not use mutable data structures for argument defaults | 275 | def mutable_annotations( 276 | a: list[int] | None = [], @@ -317,7 +317,7 @@ B006_B008.py:277:35: B006 Do not use mutable data structures for argument defaul | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 274 274 | 275 275 | def mutable_annotations( 276 276 | a: list[int] | None = [], @@ -332,7 +332,7 @@ B006_B008.py:277:35: B006 Do not use mutable data structures for argument defaul 282 284 | 283 285 | -B006_B008.py:278:62: B006 Do not use mutable data structures for argument defaults +B006_B008.py:278:62: B006 [*] Do not use mutable data structures for argument defaults | 276 | a: list[int] | None = [], 277 | b: Optional[Dict[int, int]] = {}, @@ -343,7 +343,7 @@ B006_B008.py:278:62: B006 Do not use mutable data structures for argument defaul | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 275 275 | def mutable_annotations( 276 276 | a: list[int] | None = [], 277 277 | b: Optional[Dict[int, int]] = {}, @@ -357,7 +357,7 @@ B006_B008.py:278:62: B006 Do not use mutable data structures for argument defaul 282 284 | 283 285 | -B006_B008.py:279:80: B006 Do not use mutable data structures for argument defaults +B006_B008.py:279:80: B006 [*] Do not use mutable data structures for argument defaults | 277 | b: Optional[Dict[int, int]] = {}, 278 | c: Annotated[Union[Set[str], abc.Sized], "annotation"] = set(), @@ -368,7 +368,7 @@ B006_B008.py:279:80: B006 Do not use mutable data structures for argument defaul | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 276 276 | a: list[int] | None = [], 277 277 | b: Optional[Dict[int, int]] = {}, 278 278 | c: Annotated[Union[Set[str], abc.Sized], "annotation"] = set(), @@ -381,7 +381,7 @@ B006_B008.py:279:80: B006 Do not use mutable data structures for argument defaul 282 284 | 283 285 | -B006_B008.py:284:52: B006 Do not use mutable data structures for argument defaults +B006_B008.py:284:52: B006 [*] Do not use mutable data structures for argument defaults | 284 | def single_line_func_wrong(value: dict[str, str] = {}): | ^^ B006 @@ -389,7 +389,7 @@ B006_B008.py:284:52: B006 Do not use mutable data structures for argument defaul | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 281 281 | pass 282 282 | 283 283 | @@ -402,7 +402,7 @@ B006_B008.py:284:52: B006 Do not use mutable data structures for argument defaul 287 289 | 288 290 | def single_line_func_wrong(value: dict[str, str] = {}): -B006_B008.py:288:52: B006 Do not use mutable data structures for argument defaults +B006_B008.py:288:52: B006 [*] Do not use mutable data structures for argument defaults | 288 | def single_line_func_wrong(value: dict[str, str] = {}): | ^^ B006 @@ -411,7 +411,7 @@ B006_B008.py:288:52: B006 Do not use mutable data structures for argument defaul | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 285 285 | """Docstring""" 286 286 | 287 287 | @@ -424,7 +424,7 @@ B006_B008.py:288:52: B006 Do not use mutable data structures for argument defaul 291 293 | 292 294 | -B006_B008.py:293:52: B006 Do not use mutable data structures for argument defaults +B006_B008.py:293:52: B006 [*] Do not use mutable data structures for argument defaults | 293 | def single_line_func_wrong(value: dict[str, str] = {}): | ^^ B006 @@ -432,7 +432,7 @@ B006_B008.py:293:52: B006 Do not use mutable data structures for argument defaul | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 290 290 | ... 291 291 | 292 292 | @@ -444,7 +444,7 @@ B006_B008.py:293:52: B006 Do not use mutable data structures for argument defaul 295 297 | 296 298 | -B006_B008.py:297:52: B006 Do not use mutable data structures for argument defaults +B006_B008.py:297:52: B006 [*] Do not use mutable data structures for argument defaults | 297 | def single_line_func_wrong(value: dict[str, str] = {}): | ^^ B006 @@ -453,7 +453,7 @@ B006_B008.py:297:52: B006 Do not use mutable data structures for argument defaul | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 294 294 | """Docstring"""; ... 295 295 | 296 296 | @@ -465,7 +465,7 @@ B006_B008.py:297:52: B006 Do not use mutable data structures for argument defaul 299 301 | ... 300 302 | -B006_B008.py:302:52: B006 Do not use mutable data structures for argument defaults +B006_B008.py:302:52: B006 [*] Do not use mutable data structures for argument defaults | 302 | def single_line_func_wrong(value: dict[str, str] = { | ____________________________________________________^ @@ -476,7 +476,7 @@ B006_B008.py:302:52: B006 Do not use mutable data structures for argument defaul | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 299 299 | ... 300 300 | 301 301 | @@ -500,7 +500,7 @@ B006_B008.py:308:52: B006 Do not use mutable data structures for argument defaul | = help: Replace with `None`; initialize within function -B006_B008.py:313:52: B006 Do not use mutable data structures for argument defaults +B006_B008.py:313:52: B006 [*] Do not use mutable data structures for argument defaults | 313 | def single_line_func_wrong(value: dict[str, str] = {}): | ^^ B006 @@ -508,7 +508,7 @@ B006_B008.py:313:52: B006 Do not use mutable data structures for argument defaul | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 310 310 | """Docstring""" 311 311 | 312 312 | diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/snapshots/ruff_linter__rules__flake8_bugbear__tests__extend_immutable_calls_arg_annotation.snap b/crates/ruff_linter/src/rules/flake8_bugbear/snapshots/ruff_linter__rules__flake8_bugbear__tests__extend_immutable_calls_arg_annotation.snap index 82d3a1f8a543f..3a211c6e944d4 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/snapshots/ruff_linter__rules__flake8_bugbear__tests__extend_immutable_calls_arg_annotation.snap +++ b/crates/ruff_linter/src/rules/flake8_bugbear/snapshots/ruff_linter__rules__flake8_bugbear__tests__extend_immutable_calls_arg_annotation.snap @@ -1,7 +1,7 @@ --- source: crates/ruff_linter/src/rules/flake8_bugbear/mod.rs --- -B006_extended.py:17:55: B006 Do not use mutable data structures for argument defaults +B006_extended.py:17:55: B006 [*] Do not use mutable data structures for argument defaults | 17 | def error_due_to_missing_import(foo: ImmutableTypeA = []): | ^^ B006 @@ -9,7 +9,7 @@ B006_extended.py:17:55: B006 Do not use mutable data structures for argument def | = help: Replace with `None`; initialize within function -ℹ Possible fix +ℹ Suggested fix 14 14 | ... 15 15 | 16 16 | From 9edcb678d0fe6991d3b6f85406572c70a423c99e Mon Sep 17 00:00:00 2001 From: Claudio Jolowicz Date: Sat, 21 Oct 2023 18:09:10 +0200 Subject: [PATCH 2/2] Add `Known problems` section to explain why the fix is unsafe --- .../rules/flake8_bugbear/rules/mutable_argument_default.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/mutable_argument_default.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/mutable_argument_default.rs index e0208b472a7e3..71925d0f2da08 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/mutable_argument_default.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/mutable_argument_default.rs @@ -30,6 +30,12 @@ use crate::checkers::ast::Checker; /// Types outside of the standard library can be marked as immutable with the /// [`flake8-bugbear.extend-immutable-calls`] configuration option. /// +/// ## Known problems +/// Mutable argument defaults can be used intentionally to cache computation +/// results. Replacing the default with `None` or an immutable data structure +/// does not work for such usages. Instead, prefer the `@functools.lru_cache` +/// decorator from the standard library. +/// /// ## Example /// ```python /// def add_to_list(item, some_list=[]):