Módulo de inspección en Python

El módulo de inspección ayuda a verificar los objetos presentes en el código que hemos escrito. Como Python es un lenguaje OOP y todo el código que se escribe es básicamente una interacción entre estos objetos, por lo tanto, el módulo de inspección se vuelve muy útil para inspeccionar ciertos módulos o ciertos objetos. También podemos usarlo para obtener un análisis detallado de ciertas llamadas a funciones o rastreos para que la depuración sea más fácil.

El módulo de inspección proporciona muchos métodos, estos métodos se pueden clasificar en dos categorías, es decir, métodos para verificar el tipo de token y métodos para recuperar la fuente del token. Los métodos más utilizados de ambas categorías se mencionan a continuación.

Métodos para verificar el tipo de token:

  • isclass(): El método isclass() devuelve True si ese objeto es una clase o false en caso contrario. Cuando se combina con las funciones getmembers() , muestra la clase y su tipo. Se utiliza para inspeccionar clases en vivo.

Ejemplo:

Python3

# import required modules
import inspect
  
# create class
class A(object):
    pass
  
# use isclass()
print(inspect.isclass(A))

Producción:

True
  • ismodule(): Esto devuelve verdadero si el argumento dado es un módulo importado.

Ejemplo:

Python3

# import required modules
import inspect
import numpy
  
# use ismodule()
print(inspect.ismodule(numpy))

Producción:

True
  • isfunction(): este método devuelve verdadero si el argumento dado es un nombre de función incorporado.

Ejemplo:

Python3

# import required modules
import inspect
  
# explicit function
def fun(a):
    return 2*a
  
# use isfunction()
print(inspect.isfunction(fun))

Producción:

True
  • ismethod(): este método se utiliza para comprobar si el argumento pasado es el nombre de un método o no.

Ejemplo:

Python3

# import required modules
import inspect
import collections
  
# use ismethod()
print(inspect.ismethod(collections.Counter))

Producción:

False

Métodos para recuperar la fuente del token:

  • getclasstree() : El método getclasstree() ayudará a obtener e inspeccionar la jerarquía de clases. Devuelve una tupla de esa clase y la de sus clases base anteriores. Eso, combinado con el método getmro() que devuelve las clases base, ayuda a comprender la jerarquía de clases.

Ejemplo 1:

Python3

# import required module
import inspect
  
# create classes
class A(object):
    pass
  
class B(A):
    pass
  
class C(B):
    pass
  
# not nested
print(inspect.getmro(C))  

Producción:

(<clase ‘__principal__.C’>, <clase ‘__principal__.B’>, <clase ‘__principal__.A’>, <clase ‘objeto’>) ​

Ejemplo 2:

Python3

# import required module
import inspect
  
# create classes
class A(object):
    pass
  
class B(A):
    pass
  
class C(B):
    pass
  
# nested list of tuples
for i in (inspect.getclasstree(inspect.getmro(C))):
    print(i)

Producción:

(<clase ‘objeto’>,()) [(<clase ‘__principal__.A’>, (<clase ‘objeto’>,)), [(<clase ‘__principal__.B’>, (<clase ‘__principal__. A’>,)), [(<clase ‘__principal__.C’>, (<clase ‘__principal__.B’>,))]]]

  • getmembers(): este método devuelve las funciones miembro presentes en el módulo pasado como argumento de este método.

Ejemplo:

Python3

# import required module
import inspect
import math
  
# shows the member functions
# of any module or object
print(inspect.getmembers(math))

Producción:

[(‘__doc__’, ‘Este módulo brinda acceso a las funciones matemáticas\ndefinidas por el estándar C.’), (‘__loader__’, <class ‘_frozen_importlib.BuiltinImporter’>), (‘__name__’, ‘math’), (‘__paquete__’, ”), (‘__spec__’, ModuleSpec(name=’math’, loader=<clase ‘_frozen_importlib.BuiltinImporter’>, origin=’incorporado’)), (‘acos’, <construido- en función acos>), (‘acosh’, <función integrada acosh>), (‘asin’, <función integrada asin>), (‘asinh’, <función integrada asinh>), (‘ atan’, <función integrada atan>), (‘atan2’, <función integrada atan2>), (‘atanh’, <función integrada atanh>), (‘ceil’, <función integrada ceil>), (‘copysign’, <función incorporada copysign>), (‘cos’, <función incorporada cos>), (‘cosh’, <función incorporada cosh>), (‘grados’ , <grados de función incorporados>), (‘e’, 2.718281828459045), (‘erf’, <función integrada erf>), (‘erfc’, <función integrada erfc>), (‘exp’, <función integrada exp>), (‘expm1’, <función integrada expm1>), (‘fabs’, <fabs de función integrada>), (‘factorial’, <factorial de función integrada>), (‘suelo’, <suelo de función integrada>) , (‘fmod’, <función integrada fmod>), (‘frexp’, <función integrada freexp>), (‘fsum’, <función integrada fsum>), (‘gamma’, <función integrada -in función gamma>), (‘gcd’, <función incorporada gcd>), (‘hypot’, <función incorporada hypot>), (‘inf’, inf), (‘isclose’, <construido -in función isclose>), (‘isfinite’, <función integrada isfinite>), (‘isinf’, <función integrada isinf>), (‘isnan’, <función integrada isnan>), ( ‘ldexp’, <función incorporada ldexp>), (‘lgamma’, <función integrada lgamma>), (‘log’, <función integrada log1>), (‘log10’, <función integrada log10>), (‘log1p’, <función integrada log1p>), (‘log2’, <función incorporada log2>), (‘modf’, <función incorporada modf>), (‘nan’, nan), (‘pi’, 3.141592653589793), (‘pow’, < función integrada pow>), (‘radianes’, <función integrada radianes>), (‘resto’, <resto de función integrada>), (‘sin’, <función integrada sin>), (‘sinh’, <función integrada sinh>), (‘sqrt’, <función integrada sqrt>), (‘tan’, <función integrada tan>), (‘tanh’, <función integrada en función tanh>), (‘tau’, 6.283185307179586), (‘trunc’, <función integrada trunc>)]función integrada log2>), (‘modf’, <función integrada modf>), (‘nan’, nan), (‘pi’, 3.141592653589793), (‘pow’, <función integrada pow> ), (‘radianes’, <función incorporada radianes>), (‘resto’, <resto de función incorporada>), (‘sin’, <función incorporada sin>), (‘sinh’, < función integrada sinh>), (‘sqrt’, <función integrada sqrt>), (‘tan’, <función integrada tan>), (‘tanh’, <función integrada tanh>), (‘tau’, 6.283185307179586), (‘trunc’, <función integrada trunc>)]función integrada log2>), (‘modf’, <función integrada modf>), (‘nan’, nan), (‘pi’, 3.141592653589793), (‘pow’, <función integrada pow> ), (‘radianes’, <función incorporada radianes>), (‘resto’, <resto de función incorporada>), (‘sin’, <función incorporada sin>), (‘sinh’, < función integrada sinh>), (‘sqrt’, <función integrada sqrt>), (‘tan’, <función integrada tan>), (‘tanh’, <función integrada tanh>), (‘tau’, 6.283185307179586), (‘trunc’, <función integrada trunc>)](‘sqrt’, <función integrada sqrt>), (‘tan’, <función integrada tan>), (‘tanh’, <función integrada tanh>), (‘tau’, 6.283185307179586), (‘trunc’, <función incorporada trunc>)](‘sqrt’, <función integrada sqrt>), (‘tan’, <función integrada tan>), (‘tanh’, <función integrada tanh>), (‘tau’, 6.283185307179586), (‘trunc’, <función incorporada trunc>)]

  • signature(): El método signature() ayuda al usuario a comprender los atributos que se van a pasar a una función.

Python3

# import required modules
import inspect
import collections
  
# use signature()
print(inspect.signature(collections.Counter))

Producción:

(*args, **kwds)
  • stack(): este método ayuda a examinar la pila del intérprete o el orden en que se llamaron las funciones.

Python3

# import required module
import inspect
  
# define explicit function
def Fibonacci(n):
    if n < 0:
        return 0
  
    elif n == 0:
        return 0
  
    elif n == 1:
        return 1
    else:
        return Fibonacci(n-1)+Fibonacci(n-2)
  
  
# Driver Program
(Fibonacci(12))
  
# inpsecting interpreter stack
print(inspect.stack())

Producción:

[FrameInfo(frame=<frame at 0x000002AC9BF9FD18, file ‘<ipython-input-8-3080f52ca090>’, line 22, code <module>>, filename='<ipython-input-8-3080f52ca090>’, lineno=22, function='<módulo>’, code_context=[‘print(inspect.stack())\n’], index=0), FrameInfo(frame=<frame at 0x000002AC9BAABA38, file ‘D:\\Software\\Anaconda\ \lib\\site-packages\\IPython\\core\\interactiveshell.py’, línea 3331, código run_code>, filename=’D:\\Software\\Anaconda\\lib\\site-packages\\IPython\ \core\\interactiveshell.py’, lineno=3331, function=’run_code’, code_context=[‘ exec(code_obj, self.user_global_ns, self.user_ns)\n’], index=0), FrameInfo(frame=< marco en 0x000002AC9A94B608, archivo ‘D:\\Software\\Anaconda\\lib\\site-packages\\IPython\\core\\interactiveshell.py’, línea 3254, código run_ast_nodes>, filename=’D:\\Software\\Anaconda\\lib\\site-packages\\IPython\\core\\interactiveshell.py’, lineno=3254, function=’run_ast_nodes’, code_context=[‘ if (await self.run_code(code, resultado, async_=asy)):\n’], index=0), FrameInfo(frame=<frame at 0x000002AC9BA8D768, file ‘D:\\Software\\Anaconda\\lib\\site-packages\\IPython\\ core\\interactiveshell.py’, línea 3063, código run_cell_async>, filename=’D:\\Software\\Anaconda\\lib\\site-packages\\IPython\\core\\interactiveshell.py’, lineno=3063 , function=’run_cell_async’, code_context=[‘ interactividad=interactividad, compilador=compilador, resultado=resultado)\n’], index=0), FrameInfo(frame=<marco en 0x000002AC9C452618, archivo ‘D:\\Software\ \Anaconda\\lib\\site-packages\\IPython\\core\\async_helpers.py’, línea 68, código _pseudo_sync_runner>, filename=’D:\\Software\\Anaconda\\lib\\site-packages\\IPython\\core\\async_helpers.py’, lineno=68, function=’_pseudo_sync_runner’, code_context=[‘ coro.send(Ninguno)\n’ ], index=0), FrameInfo(frame=<marco en 0x000002AC9BEE1778, archivo ‘D:\\Software\\Anaconda\\lib\\site-packages\\IPython\\core\\interactiveshell.py’, línea 2886, código _run_cell>, filename=’D:\\Software\\Anaconda\\lib\\site-packages\\IPython\\core\\interactiveshell.py’, lineno=2886, function=’_run_cell’, code_context=[‘ return runner(coro)\n’], index=0), FrameInfo(frame=<frame at 0x000002AC9BE85FC8, file ‘D:\\Software\\Anaconda\\lib\\site-packages\\IPython\\core\\ interactiveshell.py’, línea 2858, código run_cell>, filename=’D:\\Software\\Anaconda\\lib\\site-packages\\IPython\\core\\interactiveshell.py’, lineno=2858, function= ‘run_cell’, code_context=[‘ raw_cell,store_history, silent, shell_futures)\n’], index=0), FrameInfo(frame=<frame at 0x000002AC9C464208, file ‘D:\\Software\\Anaconda\\lib\\site-packages\\ipykernel\\zmqshell. py’, línea 536, código run_cell>, filename=’D:\\Software\\Anaconda\\lib\\site-packages\\ipykernel\\zmqshell.py’, lineno=536, function=’run_cell’, code_context =[‘ return super(ZMQInteractiveShell, self).run_cell(*args, **kwargs)\n’], index=0), FrameInfo(frame=<frame at 0x000002AC9BECB108, archivo ‘D:\\Software\\Anaconda\ \lib\\site-packages\\ipykernel\\ipkernel.py’, línea 300, código do_execute>, filename=’D:\\Software\\Anaconda\\lib\\site-packages\\ipykernel\\ipkernel. py’, lineno=300, function=’do_execute’, code_context=[‘ res = shell.run_cell(code, store_history=store_history, silent=silent)\n’], index=0), FrameInfo(frame=<frame at 0x000002AC9BF9FAF8,archivo ‘D:\\Software\\Anaconda\\lib\\site-packages\\tornado\\gen.py’, línea 209, envoltorio de código>, filename=’D:\\Software\\Anaconda\\lib\ \site-packages\\tornado\\gen.py’, lineno=209, function=’wrapper’, code_context=[‘ producido = siguiente(resultado)\n’], index=0), FrameInfo(frame=<frame en 0x000002AC9BECAEB8, archivo ‘D:\\Software\\Anaconda\\lib\\site-packages\\ipykernel\\kernelbase.py’, línea 541, código execute_request>, filename=’D:\\Software\\Anaconda\ \lib\\site-packages\\ipykernel\\kernelbase.py’, lineno=541, function=’execute_request’, code_context=[‘ user_expressions, allow_stdin,\n’], index=0), FrameInfo(frame=< cuadro en 0x000002AC9BF9F6B8, archivo ‘D:\\Software\\Anaconda\\lib\\site-packages\\tornado\\gen.py’, línea 209, envoltorio de código>, nombre de archivo=’D:\\Software\\Anaconda \\lib\\paquetes de sitio\\tornado\\gen.py’,lineno=209, function=’envoltura’, code_context=[‘ producido = siguiente(resultado)\n’], index=0), FrameInfo(frame=<frame at 0x000002AC9BEE1BD8, file ‘D:\\Software\\Anaconda\ \lib\\site-packages\\ipykernel\\kernelbase.py’, línea 268, código dispatch_shell>, filename=’D:\\Software\\Anaconda\\lib\\site-packages\\ipykernel\\kernelbase. py’, lineno=268, function=’dispatch_shell’, code_context=[‘ yield gen.maybe_future(handler(stream, idents, msg))\n’], index=0), FrameInfo(frame=<frame at 0x000002AC9BFA0378, archivo ‘D:\\Software\\Anaconda\\lib\\site-packages\\tornado\\gen.py’, línea 209, envoltorio de código>, filename=’D:\\Software\\Anaconda\\lib\ \site-packages\\tornado\\gen.py’, lineno=209, function=’wrapper’, code_context=[‘ producido = siguiente(resultado)\n’], index=0), FrameInfo(frame=<frame en 0x000002AC9C44A848,archivo ‘D:\\Software\\Anaconda\\lib\\site-packages\\ipykernel\\kernelbase.py’, línea 361, código process_one>, filename=’D:\\Software\\Anaconda\\lib\ \site-packages\\ipykernel\\kernelbase.py’, lineno=361, function=’process_one’, code_context=[‘ yield gen.maybe_future(dispatch(*args))\n’], index=0), FrameInfo (marco = <marco en 0x000002AC9BE85368, archivo ‘D:\\Software\\Anaconda\\lib\\site-packages\\tornado\\gen.py’, línea 748, ejecución de código>, nombre de archivo=’D:\\ Software\\Anaconda\\lib\\site-packages\\tornado\\gen.py’, lineno=748, function=’run’, code_context=[‘ yielded = self.gen.send(value)\n’] , index=0), FrameInfo(frame=<marco en 0x000002AC9C456048, archivo ‘D:\\Software\\Anaconda\\lib\\site-packages\\tornado\\gen.py’, línea 787, código interno>, filename=’D:\\Software\\Anaconda\\lib\\site-packages\\tornado\\gen.py’, lineno=787,function=’inner’, code_context=[‘ self.run()\n’], index=0), FrameInfo(frame=<frame at 0x000002AC9BE882D8, file ‘D:\\Software\\Anaconda\\lib\\site -packages\\tornado\\ioloop.py’, línea 743, código _run_callback>, filename=’D:\\Software\\Anaconda\\lib\\site-packages\\tornado\\ioloop.py’, lineno= 743, function=’_run_callback’, code_context=[‘ ret = callback()\n’], index=0), FrameInfo(frame=<frame at 0x000002AC9C4519A8, archivo ‘D:\\Software\\Anaconda\\lib\ \site-packages\\tornado\\ioloop.py’, línea 690, código <lambda>>, filename=’D:\\Software\\Anaconda\\lib\\site-packages\\tornado\\ioloop.py ‘, lineno=690, function='<lambda>’, code_context=[‘ lambda f: self._run_callback(functools.partial(callback, future))\n’], index=0), FrameInfo(frame=<frame en 0x000002AC9BEE5808, archivo ‘D:\\Software\\Anaconda\\lib\\asyncio\\events.py’, línea 88, código _run>, filename=’D:\\Software\\Anaconda\\lib\\asyncio\\events.py’, lineno=88, function=’_run’, code_context=[‘ self._context.run(self._callback, *self._args)\n’], index=0), FrameInfo(frame=<marco en 0x000002AC9BEC9798, archivo ‘ D:\\Software\\Anaconda\\lib\\asyncio\\base_events.py’, línea 1782, código _run_once>, filename=’D:\\Software\\Anaconda\\lib\\asyncio\\base_events.py ‘, lineno=1782, function=’_run_once’, code_context=[‘ handle._run()\n’], index=0), FrameInfo(frame=<frame at 0x000002AC9C44BB88, file ‘D:\\Software\\Anaconda \\lib\\asyncio\\base_events.py’, línea 538, código run_forever>, filename=’D:\\Software\\Anaconda\\lib\\asyncio\\base_events.py’, lineno=538, function= ‘run_forever’, code_context=[‘ self._run_once()\n’], index=0),FrameInfo(frame=<marco en 0x000002AC9C44B9A8, archivo ‘D:\\Software\\Anaconda\\lib\\site-packages\\tornado\\platform\\asyncio.py’, línea 153, inicio de código>, nombre de archivo=’ D:\\Software\\Anaconda\\lib\\site-packages\\tornado\\platform\\asyncio.py’, lineno=153, function=’start’, code_context=[‘ self.asyncio_loop.run_forever() \n’], índice=0), FrameInfo(marco=<marco en 0x000002AC9C335248, archivo ‘D:\\Software\\Anaconda\\lib\\site-packages\\ipykernel\\kernelapp.py’, línea 583, código de inicio>, nombre de archivo = ‘D:\\Software\\Anaconda\\lib\\site-packages\\ipykernel\\kernelapp.py’, lineno=583, function=’start’, code_context=[‘ self.io_loop .start()\n’], index=0), FrameInfo(frame=<frame at 0x000002AC9A980F38, file ‘D:\\Software\\Anaconda\\lib\\site-packages\\traitlets\\config\\application .py’, línea 664, código launch_instance>, filename=’D:\\Software\\Anaconda\\lib\\site-packages\\traitlets\\config\\application.py’, lineno=664, function=’launch_instance’, code_context=[‘ app.start()\n’] , index=0), FrameInfo(frame=<marco en 0x000002AC98403228, archivo ‘D:\\Software\\Anaconda\\lib\\site-packages\\ipykernel_launcher.py’, línea 16, código <módulo>>, nombre de archivo =’D:\\Software\\Anaconda\\lib\\site-packages\\ipykernel_launcher.py’, lineno=16, function='<módulo>’, code_context=[‘ app.launch_new_instance()\n’] , índice=0), FrameInfo(marco=<marco en 0x000002AC985AE468, archivo ‘D:\\Software\\Anaconda\\lib\\runpy.py’, línea 85, código _run_code>, nombre de archivo=’D:\\Software \\Anaconda\\lib\\runpy.py’, lineno=85, function=’_run_code’, code_context=[‘ exec(code, run_globals)\n’], index=0), FrameInfo(frame=<frame at 0x000002AC97CE5038, archivo ‘D:\\Software\\Anaconda\\lib\\runpy.py’, línea 193, código _run_module_as_main>, filename=’D:\\Software\\Anaconda\\lib\\runpy.py’, lineno=193, function=’_run_module_as_main’, code_context=[‘ “__main__”, mod_spec )\n’], índice=0)]

  • getsource(): este método devuelve el código fuente de un módulo, clase, método o una función que pasa como argumento del método getsource() .

Ejemplo:

Python3

# import required modules
import inspect
  
def fun(a,b):
    # product of 
    # two numbers
    return a*b
  
# use getsource()
print(inspect.getsource(fun))

Producción:

def fun(a,b):
    # product of 
    # two numbers
    return a*b
  • getmodule(): este método devuelve el nombre del módulo de un objeto en particular pasado como argumento en este método.

Python3

# import required modules
import inspect
import collections
  
# use getmodule()
print(inspect.getmodule(collections))

Producción:

<módulo ‘colecciones’ de ‘D:\\Software\\Anaconda\\lib\\colecciones\\__init__.py’>

  • getdoc(): El método getdoc() devuelve la documentación del argumento en este método como una string.

Ejemplo:

Python3

# import required modules
import inspect
from tkinter import *
  
# create object
root = Tk()
  
# use getdoc()
print(inspect.getdoc(root))

Producción:

Widget de nivel superior de Tk que representa principalmente la ventana principal
de una aplicación. Tiene un intérprete Tcl asociado.

Publicación traducida automáticamente

Artículo escrito por sangy987 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *