def dwim(f): source, filename, first_line = utilities.uncompile(f.func_code) tree = ast.parse(source) if isinstance(tree, ast.Module): fdef = tree.body[0] if isinstance(fdef, ast.FunctionDef): args = [x.id for x in fdef.args.args] if not hasattr(f, '__doc__'): raise ValueError("dwim requires docstring") question, newargs = terms.make_template(f.__doc__) terms.all_templates.add(question) permute = utilities.permutation_from(newargs, args) setting = terms.Setting() setting.append_line(question(*[terms.RefName(name) for name in newargs])) queue_to_learn(fdef.body, setting, f.__globals__, filename, first_line) terms.template_definitions[question.id] = locations.get_definition(f) def stub(*args): import runner Q = question(*(args[permute[i]] for i in range(len(args)))) return runner.ask(Q) stub.template = question return stub else: raise ValueError()
def term_from_args(s, args): template, keys = make_template(s) values = [arg[1] for arg in args] input_keys = [arg[0] for arg in args] permute = utilities.permutation_from(input_keys, keys) return(template(*(values[permute[i]] for i in range(len(keys)))))