From d5aa36cc694e93a4f66a3b6c235ada4649320cbc Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Wed, 15 Jan 2014 15:07:06 +0100 Subject: [PATCH] replace propery with safe_property in some evaluate cases. fixes #249 --- jedi/common.py | 7 +++++-- jedi/evaluate/__init__.py | 1 - jedi/evaluate/iterable.py | 2 +- jedi/evaluate/representation.py | 16 +++++++--------- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/jedi/common.py b/jedi/common.py index 9aa78dfe..0f704290 100644 --- a/jedi/common.py +++ b/jedi/common.py @@ -13,7 +13,6 @@ class MultiLevelStopIteration(Exception): """ StopIteration's get catched pretty easy by for loops, let errors propagate. """ - pass class UncaughtAttributeError(Exception): @@ -29,7 +28,11 @@ class UncaughtAttributeError(Exception): """ -def rethrow_uncaught(func): +def safe_property(func): + return property(reraise_uncaught(func)) + + +def reraise_uncaught(func): """ Re-throw uncaught `AttributeError`. diff --git a/jedi/evaluate/__init__.py b/jedi/evaluate/__init__.py index cacf591a..ebf046a8 100644 --- a/jedi/evaluate/__init__.py +++ b/jedi/evaluate/__init__.py @@ -219,7 +219,6 @@ class Evaluator(object): result = new_result return set(result) - @common.rethrow_uncaught def eval_expression_list(self, expression_list, follow_array=False): """ `expression_list` can be either `pr.Array` or `list of list`. diff --git a/jedi/evaluate/iterable.py b/jedi/evaluate/iterable.py index acde9b02..c999bac6 100644 --- a/jedi/evaluate/iterable.py +++ b/jedi/evaluate/iterable.py @@ -125,7 +125,7 @@ class Array(use_metaclass(CachedMetaClass, pr.Base)): names = scope.get_defined_names() return [ArrayMethod(n) for n in names] - @property + @common.safe_property def parent(self): return compiled.builtin diff --git a/jedi/evaluate/representation.py b/jedi/evaluate/representation.py index a4fe5a29..9da728f9 100644 --- a/jedi/evaluate/representation.py +++ b/jedi/evaluate/representation.py @@ -37,7 +37,7 @@ class Executable(pr.IsScope): def get_parent_until(self, *args, **kwargs): return self.base.get_parent_until(*args, **kwargs) - @property + @common.safe_property def parent(self): return self.base.parent @@ -193,7 +193,7 @@ class InstanceElement(use_metaclass(CachedMetaClass, pr.Base)): self.var = var self.is_class_var = is_class_var - @property + @common.safe_property @memoize_default(None) def parent(self): par = self.var.parent @@ -297,7 +297,7 @@ class Class(use_metaclass(CachedMetaClass, pr.IsScope)): return sub raise KeyError("Couldn't find subscope.") - @property + @common.safe_property def name(self): return self.base.name @@ -434,7 +434,6 @@ class FunctionExecution(Executable): get_set_vars = get_defined_names - @common.rethrow_uncaught def _copy_properties(self, prop): """ Literally copies a property of a Function. Copying is very expensive, @@ -462,7 +461,6 @@ class FunctionExecution(Executable): return getattr(self.base, name) @memoize_default(None) - @common.rethrow_uncaught def _scope_copy(self, scope): """ Copies a scope (e.g. if) in an execution """ # TODO method uses different scopes than the subscopes property. @@ -476,22 +474,22 @@ class FunctionExecution(Executable): copied.parent = self._scope_copy(copied.parent) return copied - @property + @common.safe_property @memoize_default([]) def returns(self): return self._copy_properties('returns') - @property + @common.safe_property @memoize_default([]) def asserts(self): return self._copy_properties('asserts') - @property + @common.safe_property @memoize_default([]) def statements(self): return self._copy_properties('statements') - @property + @common.safe_property @memoize_default([]) def subscopes(self): return self._copy_properties('subscopes')