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'