diff --git a/jedi/evaluate/helpers.py b/jedi/evaluate/helpers.py index c4169146..c5ccbbdc 100644 --- a/jedi/evaluate/helpers.py +++ b/jedi/evaluate/helpers.py @@ -220,6 +220,20 @@ class FakeName(pr.Name): super(FakeName, self).__init__(FakeSubModule, names, p, p, parent) +class LazyName(FakeName): + def __init__(self, name, parent_callback): + super(LazyName, self).__init__(name) + self._parent_callback = parent_callback + + @property + def parent(self): + return self._parent_callback() + + @parent.setter + def parent(self, value): + pass # Do nothing, lower level can try to set the parent. + + def stmts_to_stmt(statements): """ Sometimes we want to have something like a result_set and unite some diff --git a/jedi/evaluate/representation.py b/jedi/evaluate/representation.py index 56aa391e..59764a88 100644 --- a/jedi/evaluate/representation.py +++ b/jedi/evaluate/representation.py @@ -617,10 +617,12 @@ class ModuleWrapper(use_metaclass(CachedMetaClass, pr.Module)): @memoize_default() def _module_attributes(self): + def parent_callback(): + return Instance(self._evaluator, compiled.create(self._evaluator, str)) + names = ['__file__', '__package__', '__doc__', '__name__', '__version__'] # All the additional module attributes are strings. - parent = Instance(self._evaluator, compiled.create(self._evaluator, str)) - return [helpers.FakeName(n, parent) for n in names] + return [helpers.LazyName(n, parent_callback) for n in names] @memoize_default() def _sub_modules(self):