Если вам нужны только имена, тогда метод compile () и co_names будут работать лучше всего.
Вы также можете воспользоваться возможностью eval () использовать любой объект отображения в качестве параметра localals. Вы можете создать объект сопоставления для поиска и компиляции объектов из вашей базы данных, как это требуется eval ().
Пример:
class LookitUp(object):
def __init__(self):
# simulate some data
self.d = { "foo": "def foo(a):\n return a + 2"}
def __getitem__(self,key):
localdict = {}
c = compile(self.d.get(key,""),"<string>","exec")
eval(c,globals(),localdict)
return localdict[key]
d = LookitUp()
def bar(a):
return a - 1
print "foo from database :",eval("foo(3)",globals(), d)
print "bar from globals():",eval("bar(3)",globals(), d)
print "foo(bar(3)) :",eval("foo(bar(3))",globals(), d)
Результат:
foo from database : 5
bar from globals(): 2
foo(bar(3)) : 4
Возможно, вам придется изменить в зависимости от того, как выглядит ваш источник в базе данных, но это место для начала.