2010-03-04 9 views
7

मेरे पास पाइथन एएसटी है [जैसा कि ast.parse() द्वारा लौटाया गया है।पायथन एएसटी प्रसंस्करण

मुझे पता है कि यह एक क्लास विधि का एएसटी है।

मैं एक ही कक्षा के अन्य तरीकों से सभी कॉल कैसे प्राप्त करूं?

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

मैं एक समारोह है कि एक एएसटी को स्वीकार करेंगे और अन्य तरीकों की सूची प्रदान करेगा की जरूरत है: की तरह एक कोड स्निपेट के लिए

['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 पर कॉल है या किसी अन्य कॉल करने योग्य के लिए वर्तमान उदाहरण के तरीकों से कोई लेना-देना नहीं है ट्यूरिंग-पूर्ण (सीएस शब्दकोष "पूरी तरह से अघुलनशील सामान्य मामला ", गणितज्ञ की तरह बहुत कुछ" एनपी-हार्ड "कह सकता है ;-)।

लेकिन यदि आपको केवल "तत्काल कॉल" केस को हल करना है, तो आप जाने के लिए अच्छे हैं ;-)।

+0

सामान्य मामलों की जटिलता का वर्णन करने वाली टिप्पणियों के लिए बहुत धन्यवाद। –

संबंधित मुद्दे