summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClaudiu Popa <cpopa@cloudbasesolutions.com>2015-05-09 17:20:09 +0300
committerClaudiu Popa <cpopa@cloudbasesolutions.com>2015-05-09 17:20:09 +0300
commitb91489891e839d833916e98deebc97b43946e415 (patch)
tree08d2733db30dc5a682e252559290f7fe16b5989b
parent2fb20107fce519608afc3133b9ce68303eef9c0e (diff)
downloadastroid-b91489891e839d833916e98deebc97b43946e415.tar.gz
local_attr_ancestors fallbacks to using .ancestors if .mro() fails.
-rw-r--r--astroid/scoped_nodes.py6
-rw-r--r--astroid/tests/unittest_scoped_nodes.py9
2 files changed, 11 insertions, 4 deletions
diff --git a/astroid/scoped_nodes.py b/astroid/scoped_nodes.py
index 0a4f9b6..626d8f8 100644
--- a/astroid/scoped_nodes.py
+++ b/astroid/scoped_nodes.py
@@ -1150,9 +1150,9 @@ class Class(Statement, LocalsDictNodeNG, FilterStmtsMixin):
try:
ancestors = self.mro(context)[1:]
except MroError:
- # Reraise it as NotFoundError, there's no reason
- # for MroError to leak out.
- six.raise_from(NotFoundError, MroError)
+ # Fallback to use ancestors, we can't determine
+ # a sane MRO.
+ ancestors = self.ancestors(context=context)
else:
ancestors = self.ancestors(context=context)
for astroid in ancestors:
diff --git a/astroid/tests/unittest_scoped_nodes.py b/astroid/tests/unittest_scoped_nodes.py
index 2bc3254..cd41dc4 100644
--- a/astroid/tests/unittest_scoped_nodes.py
+++ b/astroid/tests/unittest_scoped_nodes.py
@@ -1348,10 +1348,17 @@ class ClassNodeTest(ModuleLoader, unittest.TestCase):
def test_local_attr_invalid_mro(self):
cls = test_utils.extract_node("""
+ # A has an invalid MRO, local_attr should fallback
+ # to using .ancestors.
class A(object, object):
+ test = 42
+ class B(A): #@
pass
""")
- self.assertRaises(NotFoundError, cls.local_attr, 'test')
+ local = cls.local_attr('test')[0]
+ inferred = next(local.infer())
+ self.assertIsInstance(inferred, nodes.Const)
+ self.assertEqual(inferred.value, 42)
def test_has_dynamic_getattr(self):
module = test_utils.build_module("""