From 50c4b7bfd90b6fbf9261ee41cb7c63c1e6cf0cbd Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Sun, 20 Apr 2014 14:14:30 +0200 Subject: [PATCH] memoize problems with defaults in combination with raised exceptions --- jedi/evaluate/cache.py | 5 ++++- jedi/evaluate/imports.py | 4 ++-- test/completion/imports.py | 14 ++++++++++++++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/jedi/evaluate/cache.py b/jedi/evaluate/cache.py index bf7a5342..1d1d06f3 100644 --- a/jedi/evaluate/cache.py +++ b/jedi/evaluate/cache.py @@ -4,6 +4,8 @@ - ``CachedMetaClass`` uses ``memoize_default`` to do the same with classes. """ +NO_DEFAULT = object() + def memoize_default(default=None, evaluator_is_first_arg=False, second_arg_is_evaluator=False): """ This is a typical memoization decorator, BUT there is one difference: @@ -32,7 +34,8 @@ def memoize_default(default=None, evaluator_is_first_arg=False, second_arg_is_ev if key in memo: return memo[key] else: - memo[key] = default + if default is not NO_DEFAULT: + memo[key] = default rv = function(obj, *args, **kwargs) memo[key] = rv return rv diff --git a/jedi/evaluate/imports.py b/jedi/evaluate/imports.py index 6147d38d..b923b880 100644 --- a/jedi/evaluate/imports.py +++ b/jedi/evaluate/imports.py @@ -27,7 +27,7 @@ from jedi.evaluate import helpers from jedi import settings from jedi.common import source_to_unicode from jedi.evaluate import compiled -from jedi.evaluate.cache import memoize_default +from jedi.evaluate.cache import memoize_default, NO_DEFAULT class ModuleNotFound(Exception): @@ -290,7 +290,7 @@ class _Importer(object): return evaluator.follow_path(iter(rest), [scope], scope) return [scope] - @memoize_default() + @memoize_default(NO_DEFAULT) def follow_file_system(self): if self.file_path: sys_path_mod = list(self.sys_path_with_modifications()) diff --git a/test/completion/imports.py b/test/completion/imports.py index fc054b01..cd5193a9 100644 --- a/test/completion/imports.py +++ b/test/completion/imports.py @@ -303,3 +303,17 @@ recurse_class1.C.a # github #239 RecursionError #? ['a'] recurse_class1.C().a + +# ----------------- +# Jedi debugging +# ----------------- + +# memoizing issues (check git history for the fix) +import not_existing_import + +if not_existing_import: + a = not_existing_import +else: + a = not_existing_import +#? +a