This is my first attempt to make a Python decorator, and I humbly admit to drawing inspiration from a number of StackOverflow posts while doing so. When I scavenged the __instancecheck__ method, the last two asserts stopped triggering, but now PyCharm’s built-in linter isn’t happy with the very last assert.

Expected type 'Union[type, Tuple[Union[type, Tuple[Any, ...]], ...]]', got 'Multiton' instead.

What is the root of the typing problem, and how can it be fixed?

Addition, after making the __init__ change recommended by a commenter another warning surfaces.

Local variable 'instance' might be referenced before assignment.
class Multiton(object):
    """ When init parameters match, reuse an old initialized object instead of making a new one. """
    def __init__(self, cls):
        # self.__dict__.update({'instances': list(), 'cls': cls})
        self.instances = list()
        self.cls = cls

    def __call__(self, *args, **kwargs):
        # make a key with the parameters
        key = (args, kwargs)

        # search for a matching old instance
        found = False
        for instance in self.instances:
            if instance['key'] == key:
                found = True

        # if not found then create a new instance
        if not found:

            instance = {'key': key, 'object': self.cls(*args, **kwargs)}

        return instance['object']

    def __instancecheck__(self, other):
        return isinstance(other, self.cls)

class YourClass:

    def __init__(self, number):
        self.number = number

yc_1 = YourClass(1)
yc_2 = YourClass(2)
yc_two = YourClass(2)

assert yc_1 != yc_2
assert yc_2 == yc_two

assert not isinstance(yc_1, Multiton)
assert isinstance(yc_1, YourClass)