2011-10-02 14 views
8

Estoy tratando de usar el módulo inspect, sin embargo, parece que no puedo usarlo en una clase incorporada (¿nativa?) O de lo contrario no entendí bien.¿Cómo obtener la lista de argumentos de un constructor de clase Python incorporado?

Estoy usando Python 2.7 y lo intenté con Python 3.2.

esto está funcionando:

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

Esto no está funcionando:

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

Me pregunto si hay otra técnica para obtener estos parámetros de forma automática?

(En mi caso, pienso en una alternativa que sería analizar la gramática de Python, el archivo ASDL que explica cómo iniciar nodos AST utilizando algún código que vi en la fuente de PyPy Project, pero me pregunto si es otra forma)

Respuesta

5

Tenga en cuenta que este código funciona bien en PyPy (donde no hay realmente distinción entre esos dos tipos de funciones).

(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,)) 
>>>> 
Cuestiones relacionadas