Skip to content

Commit 84aea7f

Browse files
authored
Drop __get__ and __set__ from unnecessary-dunder-call (#9791)
These are for descriptors which affects the behavior of the object _as a property_; I do not think they should be called directly but there is no alternative when working with the object directly. Closes #9789
1 parent b47f85e commit 84aea7f

File tree

3 files changed

+10
-5
lines changed

3 files changed

+10
-5
lines changed

crates/ruff_linter/resources/test/fixtures/pylint/unnecessary_dunder_call.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ def __getattribute__(self, item):
3030
def do_thing(self, item):
3131
return object.__getattribute__(self, item) # PLC2801
3232

33+
def use_descriptor(self, item):
34+
item.__get__(self, type(self)) # OK
35+
item.__set__(self, 1) # OK
36+
item.__delete__(self) # OK
37+
3338

3439
blah = lambda: {"a": 1}.__delitem__("a") # OK
3540

crates/ruff_linter/src/rules/pylint/rules/unnecessary_dunder_call.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -171,9 +171,11 @@ fn allowed_dunder_constants(dunder_method: &str, target_version: PythonVersion)
171171
| "__await__"
172172
| "__class__"
173173
| "__class_getitem__"
174+
| "__delete__"
174175
| "__dict__"
175176
| "__doc__"
176177
| "__exit__"
178+
| "__get__"
177179
| "__getnewargs__"
178180
| "__getnewargs_ex__"
179181
| "__getstate__"
@@ -185,6 +187,7 @@ fn allowed_dunder_constants(dunder_method: &str, target_version: PythonVersion)
185187
| "__post_init__"
186188
| "__reduce__"
187189
| "__reduce_ex__"
190+
| "__set__"
188191
| "__set_name__"
189192
| "__setstate__"
190193
| "__sizeof__"
@@ -285,14 +288,12 @@ impl DunderReplacement {
285288
"__deepcopy__" => Some(Self::MessageOnly("Use `copy.deepcopy()` function")),
286289
"__del__" => Some(Self::MessageOnly("Use `del` statement")),
287290
"__delattr__" => Some(Self::MessageOnly("Use `del` statement")),
288-
"__delete__" => Some(Self::MessageOnly("Use `del` statement")),
289291
"__delitem__" => Some(Self::MessageOnly("Use `del` statement")),
290292
"__divmod__" => Some(Self::MessageOnly("Use `divmod()` builtin")),
291293
"__format__" => Some(Self::MessageOnly(
292294
"Use `format` builtin, format string method, or f-string",
293295
)),
294296
"__fspath__" => Some(Self::MessageOnly("Use `os.fspath` function")),
295-
"__get__" => Some(Self::MessageOnly("Use `get` method")),
296297
"__getattr__" => Some(Self::MessageOnly(
297298
"Access attribute directly or use getattr built-in function",
298299
)),
@@ -308,7 +309,6 @@ impl DunderReplacement {
308309
"__pow__" => Some(Self::MessageOnly("Use ** operator or `pow()` builtin")),
309310
"__rdivmod__" => Some(Self::MessageOnly("Use `divmod()` builtin")),
310311
"__rpow__" => Some(Self::MessageOnly("Use ** operator or `pow()` builtin")),
311-
"__set__" => Some(Self::MessageOnly("Use subscript assignment")),
312312
"__setattr__" => Some(Self::MessageOnly(
313313
"Mutate attribute directly or use setattr built-in function",
314314
)),
@@ -331,8 +331,6 @@ fn allow_nested_expression(dunder_name: &str, semantic: &SemanticModel) -> bool
331331
"__init__"
332332
| "__del__"
333333
| "__delattr__"
334-
| "__set__"
335-
| "__delete__"
336334
| "__setitem__"
337335
| "__delitem__"
338336
| "__iadd__"

crates/ruff_linter/src/rules/pylint/snapshots/ruff_linter__rules__pylint__tests__PLC2801_unnecessary_dunder_call.py.snap

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,8 @@ unnecessary_dunder_call.py:31:16: PLC2801 Unnecessary dunder call to `__getattri
326326
30 | def do_thing(self, item):
327327
31 | return object.__getattribute__(self, item) # PLC2801
328328
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLC2801
329+
32 |
330+
33 | def use_descriptor(self, item):
329331
|
330332
= help: Access attribute directly or use getattr built-in function
331333

0 commit comments

Comments
 (0)