diff options
| author | Sylvain Thénault <sylvain.thenault@logilab.fr> | 2011-10-24 09:06:59 +0200 |
|---|---|---|
| committer | Sylvain Thénault <sylvain.thenault@logilab.fr> | 2011-10-24 09:06:59 +0200 |
| commit | 93e817dc07b7ea04ea0ab85405f6f2b6422e6bd6 (patch) | |
| tree | d5bcbee50ce882d06bd9cadf9d418cf2ff28d90f /checkers/utils.py | |
| parent | 43bd1e39d9939ab48dddf56b5777525dfed0834e (diff) | |
| download | pylint-git-93e817dc07b7ea04ea0ab85405f6f2b6422e6bd6.tar.gz | |
Fix for #81078: Warn if names in exception handlers clobber overwrite existing names
Diffstat (limited to 'checkers/utils.py')
| -rw-r--r-- | checkers/utils.py | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/checkers/utils.py b/checkers/utils.py index 43d619f60..81c1a7335 100644 --- a/checkers/utils.py +++ b/checkers/utils.py @@ -25,6 +25,31 @@ BUILTINS_NAME = builtins.__name__ COMP_NODE_TYPES = astng.ListComp, astng.SetComp, astng.DictComp, astng.GenExpr +def is_inside_except(node): + """Returns true if node is directly inside an exception handler""" + return isinstance(node.parent, astng.ExceptHandler) + + +def clobber_in_except(node): + """Checks if an assignment node in an except handler clobbers an existing + variable. + + Returns (True, args for W0623) if assignment clobbers an existing variable, + (False, None) otherwise. + """ + if isinstance(node, astng.AssAttr): + return (True, (node.attrname, 'object %r' % (node.expr.name,))) + elif node is not None: + name = node.name + if is_builtin(name): + return (True, (name, 'builtins')) + else: + scope, stmts = node.lookup(name) + if stmts and not isinstance(stmts[0].ass_type(), (astng.Assign, astng.AugAssign)): + return (True, (name, 'outer scope (line %i)' % (stmts[0].lineno,))) + return (False, None) + + def safe_infer(node): """return the inferred value for the given node. Return None if inference failed or if there is some ambiguity (more than |
