Created
January 12, 2016 13:51
-
-
Save mbdevpl/5746f888d628b84fb025 to your computer and use it in GitHub Desktop.
Testing metaclass support in Pylint.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
Testing metaclass support in Pylint. | |
Inspired by http://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python | |
""" | |
import typing | |
class MyMetaclass(type): | |
""" This is my metaclass. """ | |
def __new__(mcs, name, bases, attrs): | |
""" Constructs a class with this metaclass as its metaclass. """ | |
return super(MyMetaclass, mcs).__new__(mcs, name, bases, attrs) | |
def __init__(cls, name, bases, attrs): | |
""" Constructs MyMetaclass. """ | |
super(MyMetaclass, cls).__init__(name, bases, attrs) | |
#def __isinstancecheck__(cls, inst): | |
def __issubclasscheck__(cls, sub): | |
pass | |
def __getitem__(cls, item): | |
#if item.__class__ is MyMetaclass: | |
# print('item', item, 'comes from MyMetaclass!') | |
#else: | |
# print('item', item, 'comes from', item.__class__) | |
name = cls.__name__ #+ '[' + item.__name__ + ']' | |
attrs = {'__item__': (item,)} | |
return MyMetaclass.__new__(MyMetaclass, name, (), attrs) | |
def __str__(cls): | |
#desc = super(MyMetaclass, cls).__str__() | |
desc = cls.__name__ | |
try: | |
desc += '[' + ', '.join([str(item) for item in cls.__item__]) + ']' | |
except AttributeError: | |
pass | |
return desc | |
class MyClass(object, metaclass=MyMetaclass): | |
""" This is my class with my metaclass. """ | |
__item__ = (None, ) | |
def __init__(self): | |
pass | |
def fooo(self, param): | |
""" foo """ | |
pass | |
def barr(self, param): | |
""" bar """ | |
pass | |
class MySubclass(MyClass): | |
""" This is a subclass that iheriths my metaclass. """ | |
pass | |
def print_info_about_classes(classes): | |
""" Print basic info about given classes. """ | |
for cls in classes: | |
print(cls.__name__) | |
print(' - class: ', cls.__class__) | |
print(' - obj: ', cls) | |
print(' - id(): ', id(cls)) | |
try: | |
obj = cls() | |
print(cls.__name__, 'instance') | |
print(' - class: ', obj.__class__) | |
print(' - obj: ', obj) | |
print(' - id(): ', id(obj)) | |
if not isinstance(cls, obj): | |
print(' !', obj, 'is not instance of its class') | |
except TypeError: | |
print(' ! no instance') | |
def check_if_classes_are_themselves(classes1, classes2): | |
""" For all classes in list, check if that class is itself. """ | |
assert len(classes1) == len(classes2) | |
classes_count = len(classes1) | |
for i in range(classes_count): | |
if classes1[i] is not classes2[i]: | |
print(classes1[i], 'is not itself') | |
if not issubclass(classes1[i], classes2[i]): | |
print(classes1[i], 'is not subclass of itself') | |
if __name__ == '__main__': | |
C1 = [ | |
MyClass, MyClass[int], MyClass[str], MySubclass, MySubclass[int], MySubclass[str], | |
MySubclass[MyClass[int]] | |
] | |
C2 = [ | |
MyClass, MyClass[int], MyClass[str], MySubclass, MySubclass[int], MySubclass[str], | |
MySubclass[MyClass[int]] | |
] | |
print_info_about_classes(C1) | |
check_if_classes_are_themselves(C1, C2) | |
T1 = [ | |
typing.Any, typing.Optional, typing.Optional[typing.Any], | |
typing.Sequence, typing.Sequence[int], typing.Sequence[str], | |
typing.Sequence[MyClass], typing.Callable, typing.Callable[[int, int], bool] | |
] | |
T2 = [ | |
typing.Any, typing.Optional, typing.Optional[typing.Any], | |
typing.Sequence, typing.Sequence[int], typing.Sequence[str], | |
typing.Sequence[MyClass], typing.Callable, typing.Callable[[int, int], bool] | |
] | |
print_info_about_classes(T1) | |
check_if_classes_are_themselves(T1, T2) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment