from calendar import calendar ?calendar ??calendar help(calendar) ca*? *ar? *ar*? ## Importamos distintas funciones del módulo oinspect de IPython. ## Muchas de estas funciones son un wrapper sobre las funciones del ## módulo inspect de la stdlib. from IPython.core.oinspect import (getsource, getdoc, find_file, find_source_lines) ## Importamos lo siguiente para mostrar la información en pantalla from IPython.display import display, HTML ## Importamos lo siguiente para convertir nuestra ayuda a magig functions from IPython.core.magic import Magics, magics_class, line_magic ## Los siguientes imports serán usados para resaltar la sintáxis del código ## fuente. ## Es necesario tener instalada la librería pygments. from pygments import highlight from pygments.lexers import PythonLexer from pygments.formatters import HtmlFormatter ## Llamamos a la InteractiveShell y obtenemos el namespace ## del usuario (user_ns) que es un diccionario con los ## objetos disponibles ip = get_ipython() my_ns = ip.user_ns @magics_class class KikoMagic(Magics): def __init__(self, shell): super(KikoMagic, self).__init__(shell) @line_magic def kdoc(self, obj): """ Retrieve the info of an object and display this info in an output. """ if obj in my_ns.keys(): print("Doc info for {}:\n".format(obj)) print(getdoc(my_ns[obj])) else: print("There is no info for {}".format(obj)) @line_magic def kfile(self, obj): """ Retrieve the file where the object is implemented. """ if obj in my_ns.keys(): print("{} implemented in file:\n".format(obj)) print(find_file(my_ns[obj])) else: print("We can't not find the file for {}".format(obj)) @line_magic def ksourceline(self, obj): """ Retrieve the first line in the source file where the object is implemented. """ if obj in my_ns.keys(): print("The implementation of {}".format(obj)) print("starts at line {}".format(find_source_lines(my_ns[obj]))) print("in file {}".format(find_file(my_ns[obj]))) else: print("We can't not find the file for {}".format(obj)) @line_magic def ksource(self, obj): """ Retrieve the info and the source of an object and display the info in an output. """ formatter = HtmlFormatter(linenos=False, cssclass="source", nobackground=True) template = """{}""" src = getsource(my_ns[obj]) html = highlight(src, PythonLexer(), formatter) css = formatter.get_style_defs() display(HTML(template.format(css,html))) @line_magic def khelp(self, obj): self.kdoc(obj) print("") self.ksourceline(obj) print("") self.ksource(obj) ## Registramos las nuevas funciones mágicas para que estén ## disponibles en el nb. ip.register_magics(KikoMagic) %kdoc calendar %kfile calendar %ksourceline calendar %ksource calendar %khelp calendar from IPython.core.oinspect import getdoc ip = get_ipython() my_ns = ip.user_ns ## Definimos la función que hace lo que queremos. La siguiente ## función hace lo mismo que la función mágica kdoc que hemos ## implementado anteriormente def new_magic(obj): if obj in my_ns.keys(): print(getdoc(my_ns[obj])) else: print("No info found for {}".format(obj)) ## En la siguiente línea definimos la anterior función como ## una 'line magic' que se llamará 'my_new_magic' ip.register_magic_function(new_magic, 'line', "my_new_magic") %my_new_magic calendar