2010-03-04 18 views
7

Python AST'm var [ast.parse() tarafından döndürülen).Python AST işlenmesi

Bunun bir sınıf yönteminin AST olduğunu biliyorum.

Tüm çağrıları aynı sınıftaki diğer yöntemlerle nasıl bulurum?

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

Bir AST kabul edecek ve diğer yöntemlerin listesini döndürecektir bir işlevi gerekir: Böyle bir kod parçacığı için

['foo', 'bar'] 

:

Temelde, böyle bir şey toplamak istiyorum Aynı sınıfın bir yönteminde çağrılan sınıfın [dizge olarak yöntem adları].

cevap

16

genel yaklaşım ast.NodeVisitor alt sınıfı için geçerli:

>>> 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 

Ancak bu sadece self.something çağrıları "acil" yakalayacak. Genel durumda, ör. somelist.append(self.blah) ve sonra çok daha sonra somelist[i + j]() kodunda: ikincisinin self.blah aramasına veya geçerli örneğe ait yöntemlerle ilgisi olmayan başka bir kalıcılığa sahip olup olmadığının belirlenmesi sorunu Turing-complete (CS jargon için "" tamamen çözünmez "dir genel durum ", bir matematikçi gibi" NP-zor "diyebilir ;-).

Eğer ihtiyacınız olan tek şey basit "acil çağrı" durumunun çözülmesidir, gitmeniz iyidir ;-).

+0

Genel durumun karmaşıklığını açıklayan yorumlar için çok teşekkürler. –