<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def _walk_config(config, modules, f, prefix=''):
 """Recursively walk through a module list. For every module, calls ``f(config, module, name)`` where `config` is the configuration scoped to that module, `module` is the Configurable-like object, and `name` is the complete path (ending in the module name). :param dict config: configuration to walk and possibly update :param modules: modules or Configurable instances to use :type modules: iterable of :class:`~yakonfig.configurable.Configurable` :param f: callback function for each module :param str prefix: prefix name of the config :return: config """

    def work_in(parent_config, config_name, prefix, module):
        # create_config_tree() needs to have been called by now
        # and you should never hit either of these asserts
        if config_name not in parent_config:
            raise ProgrammerError('{0} not present in configuration'
                                  .format(prefix))
        if not isinstance(parent_config[config_name], collections.Mapping):
            raise ConfigurationError(
                '{0} must be an object configuration'.format(prefix))

        # do the work!
        f(parent_config[config_name], module, prefix)

    return _recurse_config(config, modules, work_in)