Зачем тебе это делать? Если вы на самом деле ничего не делаете с переменными внутри функции, функция, которая просто присваивает несколько переменных, а затем отбрасывает их, неотличима от def foo (): pass (оптимизатор будет оправдан в создании точно такого же байт-кода).
Если вы также хотите динамически добавлять код, который использует значения, то вы можете сделать это с помощью exec (хотя, если это не действительно код пользовательского ввода, почти наверняка есть лучшие способы сделать то, что вы хотите). например:
some_code = ' return a+b+c'
exec "def foo():\n " + '\n '.join('%s = %s' for k,v in bar.items()) + '\n' + some_code
(Обратите внимание, что ваш код должен иметь отступ на том же уровне.)
С другой стороны, если вы действительно хотите присвоить эти значения функции object (так что вы можете сделать foo.a и получить 1 - обратите внимание, что ваш пример кода не делает этого), Вы можете сделать это:
for key, val in bar.items():
setattr(foo, key, val)