2010-03-04 3 views
7

파이썬 AST [ast.parse()]가 반환합니다.파이썬 AST 처리

나는 이것이 클래스 메서드의 AST라는 것을 알고있다.

동일한 클래스의 다른 메소드에 대한 모든 호출을 찾으려면 어떻게합니까?

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

은 내가 AST를 받아 다른 방법의 목록을 반환하는 함수가 필요합니다 같은 코드에 대한

['foo', 'bar'] 

:

기본적으로 내가 좋아하는 뭔가를 수집 할 동일한 클래스의 메서드 내에서 호출되는 클래스의 [메서드 이름 (문자열)].

답변

16

일반적인 접근 방식은 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 

그러나 이것은 단지 self.something 호출을 "즉시"잡을 것입니다. 일반적인 경우에는 예를 들어 somelist.append(self.blah) 그리고 코드 somelist[i + j]()의 많은 부분에서 후자가 self.blah에 대한 호출인지 아니면 현재 인스턴스의 메소드와 관련이없는 다른 호출 가능 호출인지를 결정하는 문제는 Turing-complete입니다 (CS 전문 용어는 "완전히 불용성" 수학자처럼 "NP-hard"라고 말할 수 있습니다.

하지만 간단한 "즉각적인 전화"사례를 해결하는 것이 필요하면 모두 가야합니다 .--).

+0

일반적인 경우의 복잡성을 설명하는 의견에 많은 시간을드립니다. –