-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add
bad-dunder-name
extension checker (#7642)
With a 'good-dunder-name' option Co-authored-by: Pierre Sassoulas <pierre.sassoulas@gmail.com>
- Loading branch information
1 parent
5c7f980
commit 004fc74
Showing
10 changed files
with
291 additions
and
106 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
class Apples: | ||
def _init_(self): # [bad-dunder-name] | ||
pass | ||
|
||
def __hello__(self): # [bad-dunder-name] | ||
print("hello") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
class Apples: | ||
def __init__(self): | ||
pass | ||
|
||
def hello(self): | ||
print("hello") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
[MAIN] | ||
load-plugins=pylint.extensions.dunder |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
Added ``bad-dunder-name`` extension check, which flags bad or misspelled dunder methods. | ||
You can use the ``good-dunder-names`` option to allow specific dunder names. | ||
|
||
Closes #3038 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
# Licensed under the GPL: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html | ||
# For details: https://github.com/PyCQA/pylint/blob/main/LICENSE | ||
# Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt | ||
|
||
from __future__ import annotations | ||
|
||
from typing import TYPE_CHECKING | ||
|
||
from astroid import nodes | ||
|
||
from pylint.checkers import BaseChecker | ||
from pylint.constants import DUNDER_METHODS, DUNDER_PROPERTIES, EXTRA_DUNDER_METHODS | ||
from pylint.interfaces import HIGH | ||
|
||
if TYPE_CHECKING: | ||
from pylint.lint import PyLinter | ||
|
||
|
||
class DunderChecker(BaseChecker): | ||
"""Checks related to dunder methods.""" | ||
|
||
name = "dunder" | ||
priority = -1 | ||
msgs = { | ||
"W3201": ( | ||
"Bad or misspelled dunder method name %s.", | ||
"bad-dunder-name", | ||
"Used when a dunder method is misspelled or defined with a name " | ||
"not within the predefined list of dunder names.", | ||
), | ||
} | ||
options = ( | ||
( | ||
"good-dunder-names", | ||
{ | ||
"default": [], | ||
"type": "csv", | ||
"metavar": "<comma-separated names>", | ||
"help": "Good dunder names which should always be accepted.", | ||
}, | ||
), | ||
) | ||
|
||
def open(self) -> None: | ||
self._dunder_methods = ( | ||
EXTRA_DUNDER_METHODS | ||
+ DUNDER_PROPERTIES | ||
+ self.linter.config.good_dunder_names | ||
) | ||
for since_vers, dunder_methods in DUNDER_METHODS.items(): | ||
if since_vers <= self.linter.config.py_version: | ||
self._dunder_methods.extend(list(dunder_methods.keys())) | ||
|
||
def visit_functiondef(self, node: nodes.FunctionDef) -> None: | ||
"""Check if known dunder method is misspelled or dunder name is not one | ||
of the pre-defined names. | ||
""" | ||
# ignore module-level functions | ||
if not node.is_method(): | ||
return | ||
|
||
# Detect something that could be a bad dunder method | ||
if ( | ||
node.name.startswith("_") | ||
and node.name.endswith("_") | ||
and node.name not in self._dunder_methods | ||
): | ||
self.add_message( | ||
"bad-dunder-name", | ||
node=node, | ||
args=(node.name), | ||
confidence=HIGH, | ||
) | ||
|
||
|
||
def register(linter: PyLinter) -> None: | ||
linter.register_checker(DunderChecker(linter)) |
Oops, something went wrong.