2013-10-04 1 views
3

파이썬의 ast 모듈을 사용하여 클래스 상속 트리를 표시하고 있습니다.AST에서 상속 트리를 얻는 방법?

ast.NodeVisitor에 대해 visit_ClassDef(self, node) 함수를 정의하고 node.bases을 반복합니다.

그러나 기본 클래스의 이름을 문자열로 가져올 수 없었습니다. 지금까지 base.valuebase.name을 시도했지만 아무 소용이 없습니다.

>>> import ast 
>>> class Visit(ast.NodeVisitor): 
...  def visit_ClassDef(self, node): 
...   print [n.id for n in node.bases] 
... 
>>> text = open('test.py').read() 
>>> tree = ast.parse(text) 
>>> Visit().visit(tree) 
['Foo', 'Baz'] 

여기 test.py입니다 : 당신은 id 속성을 찾고 아마있어

답변

7

class Bar(Foo,Baz): 
    pass 

이 하나의 문서는 grok 수 꽤 힘든,하지만 당신은 bases 것을 알 수 있습니다 expr 개체 목록입니다. 이제는 실제로 어떤 표현이 될 수 있습니다. 함수 호출이있을 수 있습니다 :

class Bar(FooFactory(),BazFactory()): pass 

그리고 완전히 유효한 파이썬입니다. 그러나 대표적인 경우식별자 (클래스 이름)은 Name 개만있는 것입니다. 식별자의 "이름"은 id 속성에서 문자열로 가져올 수 있습니다.

+0

제게'n.id'는 파이썬 v2.7과 파이썬 v3.4에서 에러를냅니다. '[n.attr for node.bases] '는 트릭을하는 것처럼 보입니다. –

+0

이것은 직접베이스 클래스만을 출력합니다 (1 레벨 아래로 파생되지는 않음). 진정한 상속 트리에 어떻게 접근 할 수 있습니까? – rwols