Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Check py-version for async unnecessary-dunder-call #7549

Merged
merged 2 commits into from Oct 1, 2022
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
200 changes: 103 additions & 97 deletions pylint/checkers/dunder_methods.py
Expand Up @@ -16,99 +16,105 @@
from pylint.lint import PyLinter


DUNDER_METHODS: dict[str, str] = {
"__init__": "Instantiate class directly",
"__del__": "Use del keyword",
"__repr__": "Use repr built-in function",
"__str__": "Use str built-in function",
"__bytes__": "Use bytes built-in function",
"__format__": "Use format built-in function, format string method, or f-string",
"__lt__": "Use < operator",
"__le__": "Use <= operator",
"__eq__": "Use == operator",
"__ne__": "Use != operator",
"__gt__": "Use > operator",
"__ge__": "Use >= operator",
"__hash__": "Use hash built-in function",
"__bool__": "Use bool built-in function",
"__getattr__": "Access attribute directly or use getattr built-in function",
"__getattribute__": "Access attribute directly or use getattr built-in function",
"__setattr__": "Set attribute directly or use setattr built-in function",
"__delattr__": "Use del keyword",
"__dir__": "Use dir built-in function",
"__get__": "Use get method",
"__set__": "Use set method",
"__delete__": "Use del keyword",
"__instancecheck__": "Use isinstance built-in function",
"__subclasscheck__": "Use issubclass built-in function",
"__call__": "Invoke instance directly",
"__len__": "Use len built-in function",
"__length_hint__": "Use length_hint method",
"__getitem__": "Access item via subscript",
"__setitem__": "Set item via subscript",
"__delitem__": "Use del keyword",
"__iter__": "Use iter built-in function",
"__next__": "Use next built-in function",
"__reversed__": "Use reversed built-in function",
"__contains__": "Use in keyword",
"__add__": "Use + operator",
"__sub__": "Use - operator",
"__mul__": "Use * operator",
"__matmul__": "Use @ operator",
"__truediv__": "Use / operator",
"__floordiv__": "Use // operator",
"__mod__": "Use % operator",
"__divmod__": "Use divmod built-in function",
"__pow__": "Use ** operator or pow built-in function",
"__lshift__": "Use << operator",
"__rshift__": "Use >> operator",
"__and__": "Use & operator",
"__xor__": "Use ^ operator",
"__or__": "Use | operator",
"__radd__": "Use + operator",
"__rsub__": "Use - operator",
"__rmul__": "Use * operator",
"__rmatmul__": "Use @ operator",
"__rtruediv__": "Use / operator",
"__rfloordiv__": "Use // operator",
"__rmod__": "Use % operator",
"__rdivmod__": "Use divmod built-in function",
"__rpow__": "Use ** operator or pow built-in function",
"__rlshift__": "Use << operator",
"__rrshift__": "Use >> operator",
"__rand__": "Use & operator",
"__rxor__": "Use ^ operator",
"__ror__": "Use | operator",
"__iadd__": "Use += operator",
"__isub__": "Use -= operator",
"__imul__": "Use *= operator",
"__imatmul__": "Use @= operator",
"__itruediv__": "Use /= operator",
"__ifloordiv__": "Use //= operator",
"__imod__": "Use %= operator",
"__ipow__": "Use **= operator",
"__ilshift__": "Use <<= operator",
"__irshift__": "Use >>= operator",
"__iand__": "Use &= operator",
"__ixor__": "Use ^= operator",
"__ior__": "Use |= operator",
"__neg__": "Multiply by -1 instead",
"__pos__": "Multiply by +1 instead",
"__abs__": "Use abs built-in function",
"__invert__": "Use ~ operator",
"__complex__": "Use complex built-in function",
"__int__": "Use int built-in function",
"__float__": "Use float built-in function",
"__index__": "Use index method",
"__round__": "Use round built-in function",
"__trunc__": "Use math.trunc function",
"__floor__": "Use math.floor function",
"__ceil__": "Use math.ceil function",
"__enter__": "Invoke context manager directly",
"__aenter__": "Invoke context manager directly",
"__copy__": "Use copy.copy function",
"__deepcopy__": "Use copy.deepcopy function",
"__fspath__": "Use os.fspath function instead",
DUNDER_METHODS: dict[tuple[int, int], dict[str, str]] = {
(0, 0): {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Clever 👍

"__init__": "Instantiate class directly",
"__del__": "Use del keyword",
"__repr__": "Use repr built-in function",
"__str__": "Use str built-in function",
"__bytes__": "Use bytes built-in function",
"__format__": "Use format built-in function, format string method, or f-string",
"__lt__": "Use < operator",
"__le__": "Use <= operator",
"__eq__": "Use == operator",
"__ne__": "Use != operator",
"__gt__": "Use > operator",
"__ge__": "Use >= operator",
"__hash__": "Use hash built-in function",
"__bool__": "Use bool built-in function",
"__getattr__": "Access attribute directly or use getattr built-in function",
"__getattribute__": "Access attribute directly or use getattr built-in function",
"__setattr__": "Set attribute directly or use setattr built-in function",
"__delattr__": "Use del keyword",
"__dir__": "Use dir built-in function",
"__get__": "Use get method",
"__set__": "Use set method",
"__delete__": "Use del keyword",
"__instancecheck__": "Use isinstance built-in function",
"__subclasscheck__": "Use issubclass built-in function",
"__call__": "Invoke instance directly",
"__len__": "Use len built-in function",
"__length_hint__": "Use length_hint method",
"__getitem__": "Access item via subscript",
"__setitem__": "Set item via subscript",
"__delitem__": "Use del keyword",
"__iter__": "Use iter built-in function",
"__next__": "Use next built-in function",
"__reversed__": "Use reversed built-in function",
"__contains__": "Use in keyword",
"__add__": "Use + operator",
"__sub__": "Use - operator",
"__mul__": "Use * operator",
"__matmul__": "Use @ operator",
"__truediv__": "Use / operator",
"__floordiv__": "Use // operator",
"__mod__": "Use % operator",
"__divmod__": "Use divmod built-in function",
"__pow__": "Use ** operator or pow built-in function",
"__lshift__": "Use << operator",
"__rshift__": "Use >> operator",
"__and__": "Use & operator",
"__xor__": "Use ^ operator",
"__or__": "Use | operator",
"__radd__": "Use + operator",
"__rsub__": "Use - operator",
"__rmul__": "Use * operator",
"__rmatmul__": "Use @ operator",
"__rtruediv__": "Use / operator",
"__rfloordiv__": "Use // operator",
"__rmod__": "Use % operator",
"__rdivmod__": "Use divmod built-in function",
"__rpow__": "Use ** operator or pow built-in function",
"__rlshift__": "Use << operator",
"__rrshift__": "Use >> operator",
"__rand__": "Use & operator",
"__rxor__": "Use ^ operator",
"__ror__": "Use | operator",
"__iadd__": "Use += operator",
"__isub__": "Use -= operator",
"__imul__": "Use *= operator",
"__imatmul__": "Use @= operator",
"__itruediv__": "Use /= operator",
"__ifloordiv__": "Use //= operator",
"__imod__": "Use %= operator",
"__ipow__": "Use **= operator",
"__ilshift__": "Use <<= operator",
"__irshift__": "Use >>= operator",
"__iand__": "Use &= operator",
"__ixor__": "Use ^= operator",
"__ior__": "Use |= operator",
"__neg__": "Multiply by -1 instead",
"__pos__": "Multiply by +1 instead",
"__abs__": "Use abs built-in function",
"__invert__": "Use ~ operator",
"__complex__": "Use complex built-in function",
"__int__": "Use int built-in function",
"__float__": "Use float built-in function",
"__index__": "Use index method",
"__round__": "Use round built-in function",
"__trunc__": "Use math.trunc function",
"__floor__": "Use math.floor function",
"__ceil__": "Use math.ceil function",
"__enter__": "Invoke context manager directly",
"__aenter__": "Invoke context manager directly",
"__copy__": "Use copy.copy function",
"__deepcopy__": "Use copy.deepcopy function",
"__fspath__": "Use os.fspath function instead",
},
(3, 10): {
"__aiter__": "Use aiter built-in function",
"__anext__": "Use anext built-in function",
},
}


Expand Down Expand Up @@ -142,10 +148,10 @@ class DunderCallChecker(BaseChecker):
options = ()

def open(self) -> None:
self._dunder_methods = dict(DUNDER_METHODS)
if self.linter.config.py_version >= (3, 10):
self._dunder_methods["__aiter__"] = "Use aiter built-in function"
self._dunder_methods["__anext__"] = "Use anext built-in function"
self._dunder_methods: dict[str, str] = {}
for since_vers, dunder_methods in DUNDER_METHODS.items():
if since_vers <= self.linter.config.py_version:
self._dunder_methods.update(dunder_methods)
Pierre-Sassoulas marked this conversation as resolved.
Show resolved Hide resolved

@staticmethod
def within_dunder_def(node: nodes.NodeNG) -> bool:
Expand Down