У меня есть база данных, которая содержит имя функций Python и строку для их кода. Я хочу, чтобы пользователь мог ввести код Python и увидеть результат. Проблема в том, что мне нужно знать имена функций, которые они вызывают, чтобы получить код из базы данных. Например, если они вводят cubic_fit(1, 2, get_data())
, мне нужен способ получить имена функций cubic_fit
и get_data
. Есть ли хороший способ сделать это?Получить функции, вызываемые в выражении Python
ответ
Встроенная функция compile будет делать это для вас именно:
>>> compile("cubic_fit(1, 2, get_data())", '<string>', 'eval').co_names
('cubic_fit', 'get_data')
И это безопасно бежать. На самом деле код не выполняется только скомпилированным.
@Nadia Alramli [Попутно], Поздравляем за прохождение отметки в 10 000 повторений в скором времени! Я часто нахожу ваши ответы на этот вопрос и полезен (и, к сожалению, вы часто избивали меня ;-)) Следите за хорошей работой! – mjv
@mjv, спасибо! Вы быстрее, что я точно: 8 079 в 2 месяца ничего себе! :) –
Быстрый пример для вас. Обратите внимание, что вы будете ожидать правильной семантики python для этого.
Вы можете расширить это также проанализировать ваши аргументы ...
import token, tokenize, StringIO
def extract_names(src):
rawstr = StringIO.StringIO(unicode(src))
tokens = tokenize.generate_tokens(rawstr.readline)
for i, item in enumerate(tokens):
toktype, toktext, (srow,scol), (erow,ecol), line = item
if token.tok_name[toktype] == 'NAME':
print 'name:', toktext
extract_names("cubic_fit(1, 2, get_data())")
# --> output:
# name: cubic_fit
# name: get_data
Если вам просто нужны имена, то метод компиляции() и co_names будет работать лучше всего.
Вы также можете воспользоваться возможностью eval() использовать любой объект сопоставления в качестве параметра locals. Вы можете создать объект сопоставления для поиска и компиляции объектов из своей базы данных по мере необходимости с помощью 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
Вам может понадобиться изменить основанный на том, что ваш источник в базе данных выглядит, но это место, чтобы начать.
Это более или менее то, что я планирую делать :) – exupero
- 1. Функции трассировки, вызываемые в строках Python
- 2. Получить функции, вызываемые с помощью GDB
- 3. Python - Вызываемые вызовы функций
- 4. Сразу Вызываемые функции 'неопределенные'
- 5. Функции, вызываемые по
- 6. Функции Javascript, вызываемые в Chrome
- 7. Функции делегата PageViewController, вызываемые дважды
- 8. Функции, вызываемые объекты и то, как они созданы в Python
- 9. Python: использование функции в выражении панд лямбды
- 10. Получить вызываемые классы
- 11. tableView функции, не вызываемые iPhone
- 12. Функции, вызываемые не по порядку?
- 13. Функции GMSMapViewDelegate, не вызываемые iOS
- 14. Python Отражающие и вызываемые объекты
- 15. Python - функции, вызываемые внутри списка. Как это работает?
- 16. Опубликовать вызываемые (используемые) функции в matlab
- 17. Что такое вызываемые объекты в javascript?
- 18. Другие функции, вызываемые до выполнения jQuery.ajax(), выполняются
- 19. Ввод нескольких столбцов в вызываемые подматрицы python
- 20. Вызываемые модули
- 21. Получить PHP вызываемые аргументы как массив?
- 22. Временные переменные в выражении python
- 23. rootScope функции, не вызываемые при использовании ngIdle
- 24. regex, чтобы найти все функции, вызываемые
- 25. iOS ViewController Функции делегата Tableview, не вызываемые
- 26. Как возвращать вызываемые функции несколько раз/NASM
- 27. Функции, вызываемые при показе и скрытии uisearchcontroller
- 28. Сразу вызываемые функции с конструкторами/Universal Analytics
- 29. Python - Помощь в регулярном выражении
- 30. оценки функции в выражении AngularJS
Возможно, вам понадобится использовать декоратор, чтобы захватить имя функции ... но может быть и более простой способ, который я не знаю. – jldupont