<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def from_config(cls, shelf, obj, **kwargs):
 """ Construct a Recipe from a plain Python dictionary. Most of the directives only support named ingredients, specified as strings, and looked up on the shelf. But filters can be specified as objects. Additionally, each RecipeExtension can extract and handle data from the configuration. """

        def subdict(d, keys):
            new = {}
            for k in keys:
                if k in d:
                    new[k] = d[k]
            return new

        core_kwargs = subdict(obj, recipe_schema['schema'].keys())
        core_kwargs = normalize_schema(recipe_schema, core_kwargs)
        core_kwargs['filters'] = [
            parse_condition(filter, shelf.Meta.select_from)
            if isinstance(filter, dict)
            else filter
            for filter in obj.get('filters', [])
        ]
        core_kwargs.update(kwargs)
        recipe = cls(shelf=shelf, **core_kwargs)

        # Now let extensions handle their own stuff
        for ext in recipe.recipe_extensions:
            additional_schema = getattr(ext, 'recipe_schema', None)
            if additional_schema is not None:
                ext_data = subdict(obj, additional_schema.keys())
                ext_data = normalize_dict(additional_schema, ext_data)
                recipe = ext.from_config(ext_data)
        return recipe