# SPDX-License-Identifier: MIT
class Parent:
    pass
class Child(Parent):
    pass
class Other:
    pass

def inspect(value):
    print(isinstance(value, int), isinstance(value, bool), isinstance(value, float), isinstance(value, str), isinstance(value, bytes), isinstance(value, list), isinstance(value, tuple), isinstance(value, dict), isinstance(value, set), isinstance(value, frozenset), isinstance(value, object))
    print(isinstance(value, (str, (bool, float))), isinstance(value, ()), isinstance(value, Parent), isinstance(value, Child))
inspect(42)
inspect(True)
inspect(3.5)
inspect('hello')
inspect(b'bytes')
inspect([1,2])
inspect((1,'a'))
inspect({'a':1})
inspect({1,2})
inspect(frozenset([1]))
inspect(None)
inspect(Parent())
inspect(Child())
inspect(Other())
print(issubclass(bool,int),issubclass(int,bool),issubclass(Child,Parent),issubclass(Parent,Child))
print(issubclass(list,object),issubclass(Child,(str,Parent)),issubclass(Child,()),issubclass(bool,(str,(int,))))

def value():
    print('evaluated')
    return 1
print(isinstance(value(), ()))
try:
    print(isinstance(value(), (str, 7)))
except TypeError as error:
    print(repr(error))
print(isinstance(1, (int, 7)))
try:
    print(issubclass(int, (str, 7)))
except TypeError as error:
    print(repr(error))
print(issubclass(bool, (int, 7)))
try:
    print(issubclass(1, ()))
except TypeError as error:
    print(repr(error))
print(isinstance(int, type), isinstance(Child, type), isinstance(object, object))
print(isinstance(int, int), issubclass(type, object), issubclass(int, type))
empty_classes = ((), ())
print(isinstance(1, empty_classes), issubclass(1, empty_classes))

def evaluated_class():
    print('class argument evaluated')
    return 7
print(isinstance(1, (int, evaluated_class())))
print(issubclass(bool, (int, evaluated_class())))
try:
    issubclass(1, int)
except TypeError as error:
    print(repr(error))

def shadowed(int):
    try:
        isinstance(1, int)
    except TypeError as error:
        print(repr(error))
shadowed(7)
