2010-03-04 14 views
7

Mam Python AST [as zwracany przez ast.parse()].Python AST przetwarzanie

Wiem, że jest to AST metody klasy.

Jak znaleźć wszystkie połączenia z innymi metodami tej samej klasy?

Zasadniczo, chcę zebrać coś takiego:

['foo', 'bar'] 

dla fragmentu kodu, takich jak:

def baz(self): # this is a class method 
    '''baz docstring''' 
    self.foo() + self.bar() 

muszę funkcję, która będzie akceptować AST i powróci do wykazu innych metod [nazwy metod jako ciągi] klasy, które są wywoływane wewnątrz metody tej samej klasy.

Odpowiedz

16

Ogólne podejście jest do podklasy ast.NodeVisitor:

>>> class VisitCalls(ast.NodeVisitor): 
... def visit_Call(self, what): 
...  if what.func.value.id == 'self': 
...  print what.func.attr 
... 
>>> f='''def x(self): 
... return self.bar() + self.baz() 
... ''' 
>>> xx = ast.parse(f) 
>>> VisitCalls().visit(xx) 
bar 
baz 

Jednak będzie to tylko złapać "natychmiastowe" wzywa do self.something. W ogólnym przypadku możesz mieć np. somelist.append(self.blah), a następnie znacznie później w kodzie somelist[i + j](): problem z ustaleniem, czy to ostatnie jest wołaniem do self.blah, czy też z jakimś innym wywołaniem, które nie ma nic wspólnego z metodami obecnej instancji jest Turing-complete (żargon CS dla "całkowicie nierozpuszczalny w ogólny przypadek ", podobnie jak matematyk mógłby powiedzieć" NP-hard ";-).

Ale jeśli wszystko, czego potrzebujesz, to rozwiązać prosty przypadek "natychmiastowego połączenia", dobrze jest iść ;-).

+0

Wielkie dzięki za komentarze, które opisują złożoność sprawy ogólnej. –