From c25ee531a259a79cf919f5c4553fab315728987d Mon Sep 17 00:00:00 2001 From: Takafumi Arakaki Date: Fri, 15 Mar 2013 14:36:12 +0100 Subject: [PATCH 1/3] AttributeError: 'Generator' object has no attribute 'start_pos' Running py.test raises this error: ```tb test/test_api_classes.py:50: in > @pytest.mark.parametrize('definition', make_definitions()) test/test_api_classes.py:38: in make_definitions > definitions += script.definition() jedi/api_classes.py:44: in wrapper > result = func(*args, **kwds) jedi/api.py:274: in definition > if not isinstance(s, imports.ImportPath._GlobalNamespace)]) jedi/api_classes.py:418: in __init__ > super(Definition, self).__init__(definition, definition.start_pos) E AttributeError: 'Generator' object has no attribute 'start_pos' ``` --- test/test_api_classes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_api_classes.py b/test/test_api_classes.py index bcb7a722..747eabdc 100644 --- a/test/test_api_classes.py +++ b/test/test_api_classes.py @@ -32,7 +32,7 @@ def make_definitions(): definitions += api.defined_names(source) source += textwrap.dedent(""" - variable = sys or C or x or f or g or h""") + variable = sys or C or x or f or g or g() or h""") lines = source.splitlines() script = api.Script(source, len(lines), len('variable'), None) definitions += script.definition() From 6a2e535bcbb20d8331ba7bab749c03725aea7f25 Mon Sep 17 00:00:00 2001 From: Takafumi Arakaki Date: Sat, 16 Mar 2013 21:49:46 +0100 Subject: [PATCH 2/3] Add er.Generator.__getattr__ --- jedi/evaluate_representation.py | 3 +++ test/test_api_classes.py | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/jedi/evaluate_representation.py b/jedi/evaluate_representation.py index 99fded99..019e038b 100644 --- a/jedi/evaluate_representation.py +++ b/jedi/evaluate_representation.py @@ -773,6 +773,9 @@ class Generator(use_metaclass(cache.CachedMetaClass, pr.Base)): def parent(self): return self.func.parent + def __getattr__(self, name): + return getattr(self.func, name) + def __repr__(self): return "<%s of %s>" % (type(self).__name__, self.func) diff --git a/test/test_api_classes.py b/test/test_api_classes.py index 747eabdc..2da3e13e 100644 --- a/test/test_api_classes.py +++ b/test/test_api_classes.py @@ -50,4 +50,4 @@ def make_definitions(): @pytest.mark.parametrize('definition', make_definitions()) def test_basedefinition_type(definition): assert definition.type in ('module', 'class', 'instance', 'function', - 'statement', 'import', 'param') + 'generator', 'statement', 'import', 'param') From d1150cfdae2fc7b5d302cad0fcc3738fe2df7c5d Mon Sep 17 00:00:00 2001 From: Takafumi Arakaki Date: Sun, 17 Mar 2013 13:56:54 +0100 Subject: [PATCH 3/3] List allowed attributes in Generator.__getattr__ --- jedi/evaluate_representation.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/jedi/evaluate_representation.py b/jedi/evaluate_representation.py index 019e038b..f9bbd2c9 100644 --- a/jedi/evaluate_representation.py +++ b/jedi/evaluate_representation.py @@ -769,11 +769,12 @@ class Generator(use_metaclass(cache.CachedMetaClass, pr.Base)): debug.warning('Tried to get array access on a generator', self) return [] - @property - def parent(self): - return self.func.parent - def __getattr__(self, name): + if name not in ['start_pos', 'end_pos', 'parent', 'get_imports', + 'asserts', 'doc', 'docstr', 'get_parent_until', 'get_code', + 'subscopes']: + raise AttributeError("Accessing %s of %s is not allowed." + % (self, name)) return getattr(self.func, name) def __repr__(self):