2011-10-02 8 views
8

मैं inspect मॉड्यूल का उपयोग करने की कोशिश कर रहा हूं, हालांकि ऐसा लगता है कि मैं इसे अंतर्निहित (मूल?) वर्ग पर उपयोग नहीं कर सकता, या फिर मुझे गलत समझा जाता है।बिल्ट-इन पायथन क्लास कन्स्ट्रक्टर की तर्क सूची कैसे प्राप्त करें?

मैं पायथन 2.7 का उपयोग कर रहा हूं और पायथन 3.2 के साथ प्रयास किया।

यह काम कर रहा है:

>>> import inspect 
>>> class C: 
...  def __init__(self,a,b=4): 
...   self.sum = a + b 
... 
>>> inspect.getargspec(C.__init__) 
ArgSpec(args=['self','a', 'b'], varargs=None, keywords=None, defaults=(4,)) 

यह काम नहीं कर रहा:

>>> import inspect 
>>> import ast 
>>> inspect.getargspec(ast.If.__init__) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py", line 813, in getargspec 
    raise TypeError('{!r} is not a Python function'.format(func)) 
TypeError: <slot wrapper '__init__' of '_ast.AST' objects> is not a Python function 

मैं अगर वहाँ एक और तकनीक इन मानकों स्वचालित रूप से प्राप्त करने के लिए है सोच रहा हूँ?

(मेरे मामले में, मुझे एक विकल्प के बारे में लगता है जो पाइथन व्याकरण, एएसडीएल फ़ाइल को पार्स करना होगा जो पीपीपी प्रोजेक्ट के स्रोत में मैंने देखा कुछ कोड का उपयोग करके एएसटी नोड्स को कैसे लगाया जाए, लेकिन मैं सोच रहा हूं कि वहां क्या है एक और तरीका है)

उत्तर

7

उन्हें प्राप्त करने का कोई तरीका नहीं है, क्योंकि वे the C code behind the function की संपत्ति हैं, और फ़ंक्शन का ही नहीं।

5

ध्यान दें कि यह कोड पीपीपी पर ठीक काम करता है (जहां उन दो फ़ंक्शन प्रकारों के बीच वास्तव में कोई भेद नहीं है)।

(pypy)[email protected]:~$ python 
class C(Python 2.7.1 (f1e873c5533d, Sep 19 2011, 02:01:57) 
[PyPy 1.6.0-dev1 with GCC 4.4.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
Welcome to rlcompleter2 0.96 
for nice experiences hit <tab> multiple times 
And now for something completely different: ``PyPy needs a Just-in-Time JIT'' 
>>>> class C: 
.... def __init__(self, a, b=4): 
.... pass 
.... 
>>>> import inspect 
>>>> inspect.getargspec(C.__init__) 
ArgSpec(args=['self', 'a', 'b'], varargs=None, keywords=None, defaults=(4,)) 
>>>> 
संबंधित मुद्दे