Я хочу извлечь информацию о зависимости между переменными в строке, содержащей выражение Python 3 NumPy
.Например:
import numpy as np
a = np.array([10, 20, 30])
b = np.array([10, 20, 30])
c = np.array([10, 20, 30])
d = 100
# The expression string will only contain numbers, arrays, and `NumPy` functions.
expression = 'b[1:3] = a[0:3:2] + np.sum(c[:]) + d'
deps = extract_dependencies(expression)
Тогда результат должен быть:
deps: {
'b[0]': [],
'b[1]': ['a[0]', 'c[0]', 'c[1]', 'c[2]', 'd']
'b[2]': ['a[2]', 'c[0]', 'c[1]', 'c[2]', 'd']
}
Моя проблема в том, что я не могу понять, как реализовать extract_dependencies()
.
Это легко решить, если все символы в выражении не являются массивами или массивами с одноэлементной индексацией (например, foo
, bar[0]
, baz[2]
).Это можно сделать с помощью регулярных выражений или некоторого базового синтаксического анализа текста.
Однако, если переменные являются массивами, все усложняется.Для базовых операций можно использовать регулярные выражения, чтобы найти переменные в строке выражения, а затем соответственно извлечь и отобразить индексы массива.Например, легко извлечь и сопоставить индексы выражения a[0:2] = b[1:3]
.Ситуация усложняется, когда функции используются как часть строки выражения, потому что они по сути являются «черными ящиками».Вы не можете учесть все возможные сигнатуры функций, поведения и возвращаемые значения, если не жестко закодируете каждую из них.
Мне было интересно, может ли это быть решено с помощью некоторого умного использования деревьев eval
, exec
или ast
Python.
Есть идеи?:)
Спасибо.
PS: Строка выражения в конечном итоге вычисляется с использованием библиотеки asteval
.Следовательно, решение, которое использует asteval
, получит дополнительные очки!:)