import inspect
import sys
from typing import Callable


def find_class(func: Callable):
    """
    basé sur inspect._findclass mais plus robuste et qui prend en compte les fonctions locales
    note : la fonction doit avoir un module sinon None est renvoyé (ex : str => None)
    """

    cls = sys.modules.get(getattr(func, '__module__', None))
    if cls is None:
        return None
    for name in func.__qualname__.split('.')[:-1]:
        if name != '<locals>':
            cls = getattr(cls, name, None)
    if not inspect.isclass(cls):
        return None
    return cls
