472 >>> context = engine(lambda t: (runsymbol, t)) |
472 >>> context = engine(lambda t: (runsymbol, t)) |
473 >>> def fargs(expr, argspec): |
473 >>> def fargs(expr, argspec): |
474 ... x = _parseexpr(expr) |
474 ... x = _parseexpr(expr) |
475 ... n = getsymbol(x[1]) |
475 ... n = getsymbol(x[1]) |
476 ... return _buildfuncargs(x[2], context, exprmethods, n, argspec) |
476 ... return _buildfuncargs(x[2], context, exprmethods, n, argspec) |
477 >>> sorted(fargs('a(l=1, k=2)', 'k l m').keys()) |
477 >>> fargs('a(l=1, k=2)', 'k l m').keys() |
478 ['k', 'l'] |
478 ['l', 'k'] |
479 >>> args = fargs('a(opts=1, k=2)', '**opts') |
479 >>> args = fargs('a(opts=1, k=2)', '**opts') |
480 >>> args.keys(), sorted(args['opts'].keys()) |
480 >>> args.keys(), args['opts'].keys() |
481 (['opts'], ['k', 'opts']) |
481 (['opts'], ['opts', 'k']) |
482 """ |
482 """ |
483 def compiledict(xs): |
483 def compiledict(xs): |
484 return dict((k, compileexp(x, context, curmethods)) |
484 return util.sortdict((k, compileexp(x, context, curmethods)) |
485 for k, x in xs.iteritems()) |
485 for k, x in xs.iteritems()) |
486 def compilelist(xs): |
486 def compilelist(xs): |
487 return [compileexp(x, context, curmethods) for x in xs] |
487 return [compileexp(x, context, curmethods) for x in xs] |
488 |
488 |
489 if not argspec: |
489 if not argspec: |
490 # filter or function with no argspec: return list of positional args |
490 # filter or function with no argspec: return list of positional args |
492 |
492 |
493 # function with argspec: return dict of named args |
493 # function with argspec: return dict of named args |
494 _poskeys, varkey, _keys, optkey = argspec = parser.splitargspec(argspec) |
494 _poskeys, varkey, _keys, optkey = argspec = parser.splitargspec(argspec) |
495 treeargs = parser.buildargsdict(getlist(exp), funcname, argspec, |
495 treeargs = parser.buildargsdict(getlist(exp), funcname, argspec, |
496 keyvaluenode='keyvalue', keynode='symbol') |
496 keyvaluenode='keyvalue', keynode='symbol') |
497 compargs = {} |
497 compargs = util.sortdict() |
498 if varkey: |
498 if varkey: |
499 compargs[varkey] = compilelist(treeargs.pop(varkey)) |
499 compargs[varkey] = compilelist(treeargs.pop(varkey)) |
500 if optkey: |
500 if optkey: |
501 compargs[optkey] = compiledict(treeargs.pop(optkey)) |
501 compargs[optkey] = compiledict(treeargs.pop(optkey)) |
502 compargs.update(compiledict(treeargs)) |
502 compargs.update(compiledict(treeargs)) |