<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def extract_edges_from_callable(fn):
 """ This takes args and kwargs provided, and returns the names of the strings assigned. If a string is not provided for a value, an exception is raised. This is how we extract the edges provided in the brap call lambdas. """


    def extractor(*args, **kwargs):
        """
        Because I don't think this technique is common in python...

        Service constructors were defined as:
            lambda c: c('a')

        In this function:
            fn = lambda c: c('a')
            fn(anything)  # Results in anything('a')

        Here we provide a function which returns all args/kwargs
            fn(extractor)  # ["a"]

        This isn't voodoo, it's just treating a function's call if it is data.
        """
        return list(args) + list(kwargs.values())

    edges = fn(extractor)

    for edge in edges:
        if not isinstance(edge, str):
            raise ValueError('Provided edge "{}" is not a string'.format(edge))

    return list(edges)