So, if M() existed, you could say:
d = M(telephone, name)
func(**d)
or
func(**M(telephone, name))
Per your wish, Eric, the glorious successor of Q() ... named M():
>>> def M(*vals):
... import sys
... import inspect
... caller = sys._getframe(1)
... call = inspect.stack()[1].code_context[0]
... _, call = call.split('M(')
... call = call.strip()[:-1]
... names = [name.strip() for name in call.split(',')]
... dct = {}
... for name in names:
... dct[name] = eval(name, globals(), caller.f_locals)
... return dct
...
>>> x, y, z = range(3)
>>> M(x, y, z)
{'x': 0, 'y': 1, 'z': 2}
OK, it's a little bit fragile in assuming the function must be called M rather than trying to derive its name. And maybe my string version of finding the several args could be made more robust. But anyone is welcome to improve it, and the proof of concept shows that's all we need. Basically, a "dict-builder from local names" is perfectly amenable to writing as a Python function... and we don't need to inspect the underlying source code the way I believe Alex' sorcery module does (other parts of it might need that, but not this).
--