diff options
author | cpopa <devnull@localhost> | 2013-09-26 12:53:41 +0300 |
---|---|---|
committer | cpopa <devnull@localhost> | 2013-09-26 12:53:41 +0300 |
commit | 3dffa20f8c99a67a1b8eab5eb9b5da77ef96f38a (patch) | |
tree | 641bde3beccff9461352009e3f49ce894e6f5561 /checkers/classes.py | |
parent | 023b225765346f2026f714aec31ee57c4b8da5b5 (diff) | |
download | pylint-3dffa20f8c99a67a1b8eab5eb9b5da77ef96f38a.tar.gz |
Add bad-context-manager check for __exit__ special method.
Diffstat (limited to 'checkers/classes.py')
-rw-r--r-- | checkers/classes.py | 12 |
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 |