Получение результатов в нужном формате из Ast - PullRequest
0 голосов
/ 06 июля 2018

это вопрос относительно получения желаемого результата от 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, чтобы получить эти значения?

Заранее спасибо за ответ

...