From a2b483b4f569854d57d7dd705f01014ace607c7e Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Tue, 13 May 2014 01:21:32 +0200 Subject: [PATCH] None issue fix for static analysis --- jedi/evaluate/analysis.py | 3 +-- jedi/evaluate/compiled/__init__.py | 6 ------ jedi/evaluate/finder.py | 5 +++++ test/static_analysis/attribute_error.py | 3 +++ test/static_analysis/try_except.py | 5 +++++ 5 files changed, 14 insertions(+), 8 deletions(-) diff --git a/jedi/evaluate/analysis.py b/jedi/evaluate/analysis.py index d2dab132..af6c4bdc 100644 --- a/jedi/evaluate/analysis.py +++ b/jedi/evaluate/analysis.py @@ -7,7 +7,6 @@ from jedi.parser import representation as pr from jedi.evaluate.compiled import CompiledObject - CODES = { 'attribute-error': (1, AttributeError, 'Potential AttributeError.'), 'import-error': (2, ImportError, 'Potential ImportError.'), @@ -36,7 +35,7 @@ class Error(object): return first + str(CODES[self.name][0]) def description(self): - return CODES[self.name][1] + return CODES[self.name][2] def __str__(self): return '%s: %s:%s' % (self.code, self.line, self.description()) diff --git a/jedi/evaluate/compiled/__init__.py b/jedi/evaluate/compiled/__init__.py index 4d4c106a..ae7c050e 100644 --- a/jedi/evaluate/compiled/__init__.py +++ b/jedi/evaluate/compiled/__init__.py @@ -308,12 +308,6 @@ def _parse_function_doc(doc): class Builtin(CompiledObject, IsScope): - @memoize - def get_defined_names(self): - # Filter None, because it's really just a keyword, nobody wants to - # access it. - return [d for d in super(Builtin, self).get_defined_names() if d.name != 'None'] - @memoize def get_by_name(self, name): item = [n for n in self.get_defined_names() if n.get_code() == name][0] diff --git a/jedi/evaluate/finder.py b/jedi/evaluate/finder.py index f7c6683e..d84a4298 100644 --- a/jedi/evaluate/finder.py +++ b/jedi/evaluate/finder.py @@ -35,6 +35,11 @@ class NameFinder(object): self.position = position def find(self, scopes, resolve_decorator=True): + if unicode(self.name_str) == 'None': + # Filter None, because it's really just a keyword, nobody wants to + # access it. + return [] + names = self.filter_name(scopes) types = self._names_to_types(names, resolve_decorator) diff --git a/test/static_analysis/attribute_error.py b/test/static_analysis/attribute_error.py index ac83b792..5183bac7 100644 --- a/test/static_analysis/attribute_error.py +++ b/test/static_analysis/attribute_error.py @@ -36,3 +36,6 @@ Cls.class_attr_error c.instance_attr #! attribute-error c.instance_attr_error + + +c.something = None diff --git a/test/static_analysis/try_except.py b/test/static_analysis/try_except.py index 01702dbc..e3285860 100644 --- a/test/static_analysis/try_except.py +++ b/test/static_analysis/try_except.py @@ -34,6 +34,11 @@ except ImportError: pass except (NotImplementedError, AttributeError): pass +try: + #! attribute-error + str.not_existing +except (TypeError, NotImplementedError): pass + # ----------------- # detailed except # -----------------