def takes_arg(obj, arg: str) -> bool:
    """
    Checks whether the provided obj takes a certain arg.
    If it's a class, we're really checking whether its constructor does.
    If it's a function or method, we're checking the object itself.
    Otherwise, we raise an error.
    """
    if inspect.isclass(obj):
        signature = inspect.signature(obj.__init__)
    elif inspect.ismethod(obj) or inspect.isfunction(obj):
        signature = inspect.signature(obj)
    else:
        raise ConfigurationError(f"object {obj} is not callable")
    return arg in signature.parameters
def takes_arg ( obj , arg : str ) -> bool : if inspect . isclass ( obj ) : signature = inspect . signature ( obj . __init__ ) elif inspect . ismethod ( obj ) or inspect . isfunction ( obj ) : signature = inspect . signature ( obj ) else : raise ConfigurationError ( f"object {obj} is not callable" ) return arg in signature . parameters
Checks whether the provided obj takes a certain arg.
    If it's a class, we're really checking whether its constructor does.
    If it's a function or method, we're checking the object itself.
    Otherwise, we raise an error.