def make_grp_list_func(expr_str, field_names_dict, global_names_dict=None, filename=None):
"""
>>> func = make_grp_list_func('sum(a)/cnt()', {'a': 0})
>>> func([(1,), (2,), (3,)])
2
>>> func = make_grp_list_func('1+sum(a)+sum(b**2)', {'a':0, 'b':1})
>>> func([(10, 1), (20, 2)])
36
>>> func = make_grp_list_func('b+sum(a)/sum(c)', {'a': 0, 'c': 1}, {'b': 0})
>>> func([(10, 1), (20, 2), (30, 3)], [1])
11
>>> func = make_grp_list_func('sum(a)', {'a': 0})
>>> func([(1,), (2,), (3,)])
6
"""
filename = filename or '<generated>'
list_name = 'data'
lambda_args = [ast.Name(id=list_name, ctx=ast.Param(), lineno=0, col_offset=0)]
tree = ast.parse(expr_str, filename, 'eval')
tree = RewriteCntFuncs().visit(tree)
tree = RewriteGrpFuncs(field_names_dict).visit(tree)
if global_names_dict:
lambda_args.append(ast.Name(id='globaldata', ctx=ast.Param(), lineno=0, col_offset=0))
tree = RewriteName('globaldata', global_names_dict).visit(tree)
tree = ast.Expression(
body = ast.Lambda(
body=tree.body,
args=ast.arguments(
args=lambda_args,
vararg=None,
kwarg=None,
defaults=[],
),
lineno=0,
col_offset=0,
),
)
#print ast.dump(tree)
code = compile(tree, filename, 'eval')
func = eval(code)
return func
评论列表
文章目录