summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--astroid/exceptions.py4
-rw-r--r--astroid/objects.py15
-rw-r--r--astroid/tests/unittest_objects.py6
3 files changed, 17 insertions, 8 deletions
diff --git a/astroid/exceptions.py b/astroid/exceptions.py
index 9e3a279f..47f2fe50 100644
--- a/astroid/exceptions.py
+++ b/astroid/exceptions.py
@@ -46,6 +46,10 @@ class SuperError(ResolveError):
"""Error raised when there is a problem with a super call."""
+class SuperArgumentTypeError(SuperError):
+ """Error raised when the super arguments are invalid."""
+
+
class NotFoundError(ResolveError):
"""raised when we are unable to resolve a name"""
diff --git a/astroid/objects.py b/astroid/objects.py
index 5fd594df..b0a3e6c1 100644
--- a/astroid/objects.py
+++ b/astroid/objects.py
@@ -34,7 +34,10 @@ from astroid.bases import (
BUILTINS, NodeNG, Instance, _infer_stmts,
BoundMethod,
)
-from astroid.exceptions import SuperError, NotFoundError, MroError
+from astroid.exceptions import (
+ SuperError, SuperArgumentTypeError,
+ NotFoundError, MroError
+)
from astroid.node_classes import const_factory
from astroid.scoped_nodes import Class, Function
from astroid.mixins import ParentAssignTypeMixin
@@ -96,7 +99,7 @@ class Super(NodeNG):
def super_mro(self):
"""Get the MRO which will be used to lookup attributes in this super."""
if not isinstance(self.mro_pointer, Class):
- raise SuperError("The first super argument must be type.")
+ raise SuperArgumentTypeError("The first super argument must be type.")
if isinstance(self.type, Class):
# `super(type, type)`, most likely in a class method.
@@ -105,16 +108,16 @@ class Super(NodeNG):
else:
mro_type = getattr(self.type, '_proxied', None)
if not isinstance(mro_type, (Instance, Class)):
- raise SuperError("super(type, obj): obj must be an instance "
- "or subtype of type")
+ raise SuperArgumentTypeError("super(type, obj): obj must be an "
+ "instance or subtype of type")
if not mro_type.newstyle:
raise SuperError("Unable to call super on old-style classes.")
mro = mro_type.mro()
if self.mro_pointer not in mro:
- raise SuperError("super(type, obj): obj must be an instance "
- "or subtype of type")
+ raise SuperArgumentTypeError("super(type, obj): obj must be an "
+ "instance or subtype of type")
index = mro.index(self.mro_pointer)
return mro[index + 1:]
diff --git a/astroid/tests/unittest_objects.py b/astroid/tests/unittest_objects.py
index 31f648eb..24844291 100644
--- a/astroid/tests/unittest_objects.py
+++ b/astroid/tests/unittest_objects.py
@@ -239,7 +239,7 @@ class SuperTests(unittest.TestCase):
for node in ast_nodes[1:]:
inferred = next(node.infer())
self.assertIsInstance(inferred, objects.Super, node)
- with self.assertRaises(exceptions.SuperError) as cm:
+ with self.assertRaises(exceptions.SuperArgumentTypeError) as cm:
inferred.super_mro()
self.assertEqual(str(cm.exception),
"super(type, obj): obj must be an instance "
@@ -486,7 +486,9 @@ class SuperTests(unittest.TestCase):
''')
inferred = next(node.infer())
with self.assertRaises(exceptions.SuperError):
- inferred.super_mro()
+ inferred.super_mro()
+ with self.assertRaises(exceptions.SuperArgumentTypeError):
+ inferred.super_mro()
if __name__ == '__main__':