diff --git a/checkers/stdlib.py b/checkers/stdlib.py index 364633b74..604ade8ac 100644 --- a/checkers/stdlib.py +++ b/checkers/stdlib.py @@ -16,6 +16,7 @@ """Checkers for various standard library functions.""" import re +import sys import astroid @@ -25,7 +26,11 @@ from pylint.checkers import utils _VALID_OPEN_MODE_REGEX = r'^(r?U|[rwa]\+?b?)$' - +if sys.version_info >= (3, 0): + OPEN_MODULE = '_io' +else: + OPEN_MODULE = '__builtins__' + class OpenModeChecker(BaseChecker): __implements__ = (IAstroidChecker,) name = 'open_mode' @@ -40,9 +45,11 @@ class OpenModeChecker(BaseChecker): @utils.check_messages('W1501') def visit_callfunc(self, node): """Visit a CallFunc node.""" - if (hasattr(node, 'func') and utils.is_builtin_object(utils.safe_infer(node.func))): - if getattr(node.func, 'name', None) in ('open', 'file'): - self._check_open_mode(node) + if hasattr(node, 'func'): + infer = utils.safe_infer(node.func) + if infer and infer.root().name == OPEN_MODULE: + if getattr(node.func, 'name', None) in ('open', 'file'): + self._check_open_mode(node) def _check_open_mode(self, node): """Check that the mode argument of an open or file call is valid."""