Mark __init_subclass__ as classmethod (#388)
diff --git a/astroid/tests/unittest_scoped_nodes.py b/astroid/tests/unittest_scoped_nodes.py index 0eb2afa..e6ba9ec 100644 --- a/astroid/tests/unittest_scoped_nodes.py +++ b/astroid/tests/unittest_scoped_nodes.py
@@ -572,6 +572,16 @@ self.assertIsInstance(last_child, nodes.Return) self.assertEqual(func.tolineno, 5) + @test_utils.require_version(minver='3.6') + def test_method_init_subclass(self): + klass = builder.extract_node(''' + class MyClass: + def __init_subclass__(cls): + pass + ''') + method = klass['__init_subclass__'] + self.assertEqual([n.name for n in method.args.args], ['cls']) + self.assertEqual(method.type, 'classmethod') class ClassNodeTest(ModuleLoader, unittest.TestCase):
diff --git a/astroid/tree/scoped_nodes.py b/astroid/tree/scoped_nodes.py index 7e44b27..626c10e 100644 --- a/astroid/tree/scoped_nodes.py +++ b/astroid/tree/scoped_nodes.py
@@ -13,6 +13,7 @@ Lambda, GeneratorExp, DictComp and SetComp to some extent). """ +import sys import collections import io import itertools @@ -915,6 +916,8 @@ if isinstance(frame, ClassDef): if self.name == '__new__': return 'classmethod' + elif sys.version_info >= (3, 6) and self.name == '__init_subclass__': + return 'classmethod' else: type_name = 'method'