это вопрос относительно получения желаемого результата от python ast.Позвольте мне начать с показа кода, который я анализирую с помощью модуля python ast.Это как показано ниже.
a = (3>> 4) | (5>6)
#checks = ([3,4,5] > [1,2,3]) & (['a',b,2.3] > ['a',c,3.2,3])
bro = "hehe"
b = OneHotEncoding('x,y')
b.fit()
b.transform()
b.fit_transform()
# Path has been given to you already to use in function.
path = "./data/ipl_dataset.csv" #path to the csv file
a = np.zeros((1, 2, 3))
b = np.ones((1, 3, 4))
c = np.sum(c)
#x1, x2 = (0, 1)
m1,m2 = [np.zeros(),1.2,[pd.read_csv(),2]]
# random.shuffle(m)
#y1, y2 = a, b
a = (1,(1,2))
z1, z2 = [2, 4]
# m1, m2 = np.zeros(2), np.ones(4)
# m11, m12 = (np.zeros(2), np.ones(4))
son = {"dd": '4', "mm":[1,2,3]}
Теперь я использую приведенный ниже код от ast для получения информации из кода, особенно с использованием nodevisitor.
class allnames(ast.NodeVisitor):
def __init__(self):
self._name = []
self._imports = []
@property
def name(self):
return self._name
@property
def imports(self):
return self._imports
def visit_Name(self,node):
self._name.append(node.id)
def visit_Attribute(self, node):
try:
self._name.append(node.value.id+'.'+node.attr)
except AttributeError:
self.generic_visit(node)
def visit_Num(self,node):
self._name.append(node.n)
def visit_Str(self,node):
self._name.append(node.s)
Далее вспомогательная функция, которая будет возвращать все назначения, как показано ниже.
def get_all_assigns(tree):
func_calls = []
for node in ast.walk(tree):
if isinstance(node, ast.Assign):
callvisitor = allnames()
callvisitor1 = allnames()
callvisitor1.visit(node.targets[0])
callvisitor.visit(node.value)
func_calls.append([callvisitor.name,callvisitor1.name])
return func_calls
Использование этого частично решает мою проблему, чтобы получить все назначения и цели, но не вформат требуется.Например, он не захватывает ast.BinOp.Давайте посмотрим на результат, полученный в этом случае.
[[[3, 4, 5, 6], ['a']],
[['hehe'], ['bro']],
[['OneHotEncoding', 'x,y'], ['b']],
[['./data/ipl_dataset.csv'], ['path']],
[['np.zeros', 1, 2, 3], ['a']],
[['np.ones', 1, 3, 4], ['b']],
[['np.sum', 'c'], ['c']],
[['np.zeros', 1.2, 'pd.read_csv', 2], ['m1', 'm2']],
[[1, 1, 2], ['a']],
[[2, 4], ['z1', 'z2']],
[['dd', 'mm', '4', 1, 2, 3], ['son']],
[['b'], ['a']]]
давайте рассмотрим две вещи: во-первых, словарь с именем son в 32-й строке кода, который анализируется для получения выходных данных.Он имеет ключи dd, mm, где значения, связанные с ключом dd, являются str, а kk - это список [1,2,3].Я хотел бы получить значение в качестве ключа с соответствующим значением в этом случае [dd, '4'] и [mm, [1,2,3]] также хотел бы захватить BinOp, например, те, которые используются в= (3 >> 4) |(5> 6).Как мне добавить visit_Dict и visit_BinOp, чтобы получить эти значения?
Заранее спасибо за ответ