Извлечение информации о зависимости между переменными числового выражения - PullRequest
0 голосов
/ 25 сентября 2019

Я хочу извлечь информацию о зависимости между переменными в строке, содержащей выражение 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, получит дополнительные очки!:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...