summaryrefslogtreecommitdiff
path: root/checkers/classes.py
diff options
context:
space:
mode:
authorcpopa <devnull@localhost>2013-09-26 12:53:41 +0300
committercpopa <devnull@localhost>2013-09-26 12:53:41 +0300
commit3dffa20f8c99a67a1b8eab5eb9b5da77ef96f38a (patch)
tree641bde3beccff9461352009e3f49ce894e6f5561 /checkers/classes.py
parent023b225765346f2026f714aec31ee57c4b8da5b5 (diff)
downloadpylint-3dffa20f8c99a67a1b8eab5eb9b5da77ef96f38a.tar.gz
Add bad-context-manager check for __exit__ special method.
Diffstat (limited to 'checkers/classes.py')
-rw-r--r--checkers/classes.py12
1 files changed, 12 insertions, 0 deletions
diff --git a/checkers/classes.py b/checkers/classes.py
index 4c8022d..7ced271 100644
--- a/checkers/classes.py
+++ b/checkers/classes.py
@@ -152,6 +152,11 @@ MSGS = {
'non-iterator-returned',
'Used when an __iter__ method returns something which is not an \
iterable (i.e. has no `%s` method)' % NEXT_METHOD),
+ 'E0235': ('__exit__ must accept 3 arguments: type, value, traceback',
+ 'bad-context-manager',
+ 'Used when the __exit__ special method, belonging to a \
+ context manager, does not accept 3 arguments \
+ (type, value, traceback).')
}
@@ -325,6 +330,8 @@ a metaclass class method.'}
# check non-iterators in __iter__
if node.name == '__iter__':
self._check_iter(node)
+ elif node.name == '__exit__':
+ self._check_exit(node)
def _check_iter(self, node):
try:
@@ -344,6 +351,11 @@ a metaclass class method.'}
node=node)
break
+ def _check_exit(self, node):
+ positional = sum(1 for arg in node.args.args if arg.name != 'self')
+ if positional != 3 and not node.args.vararg:
+ self.add_message('bad-context-manager',
+ node=node)
def leave_function(self, node):
"""on method node, check if this method couldn't be a function