Skip to content

Instantly share code, notes, and snippets.

@mbdevpl
Created January 12, 2016 13:51
Show Gist options
  • Save mbdevpl/5746f888d628b84fb025 to your computer and use it in GitHub Desktop.
Save mbdevpl/5746f888d628b84fb025 to your computer and use it in GitHub Desktop.
Testing metaclass support in Pylint.
"""
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