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.