Ayuda y documentación en IPython

Ayuda y documentación
en IPython



Si no lee ninguna otra sección de este capítulo, lea esta: Encuentro que las herramientas discutidas aquí son las contribuciones más transformadoras de IPython a mi flujo de trabajo diario.


Cuando se le pide a una persona con mentalidad tecnológica que ayude a un amigo, familiar o colega con un problema informático, la mayoría de las veces se trata menos de saber la respuesta correcta que de saber cómo encontrar rápidamente una respuesta desconocida. En la ciencia de datos es lo mismo: los recursos web de búsqueda, como la documentación en línea, los hilos de la lista de correo y las respuestas de StackOverflow, contienen una gran cantidad de información, incluso (¡especialmente!) si se trata de un tema en el que se ha encontrado buscando antes. Ser un practicante eficaz de la ciencia de datos se trata menos de memorizar la herramienta o comando que debe usar para cada situación posible, y más de aprender a encontrar de manera efectiva la información que no conoce, ya sea a través de un motor de búsqueda web u otro medio.


Una de las funciones más útiles de IPython / Jupyter es acortar la brecha entre el usuario y el tipo de documentación y búsqueda que le ayudará a realizar su trabajo de forma eficaz. Si bien las búsquedas en la web aún juegan un papel en la respuesta a preguntas complicadas, se puede encontrar una cantidad asombrosa de información solo a través de IPython. Algunos ejemplos de las preguntas que IPython puede ayudar a responder con unas pocas teclas:


  • ¿Cómo llamo a esta función? ¿Qué argumentos y opciones tiene?
  • ¿Cómo es el código fuente de este objeto Python?
  • ¿Qué hay en este paquete que importé? ¿Qué atributos o métodos tiene este objeto?


Aquí discutiremos las herramientas de IPython para acceder rápidamente a esta información, a saber, el carácter ? para explorar la documentación, los caracteres ?? para explorar el código fuente y la tecla Tab para completado.


Accediendo a la documentación con ??

El lenguaje Python y su ecosistema de ciencia de datos se construyen pensando en el usuario, y una gran parte de eso es el acceso a la documentación. Cada objeto de Python contiene la referencia a una cadena, conocida como cadena de documentación, que en la mayoría de los casos contendrá un resumen conciso del objeto y cómo usarlo. Python tiene una función help() incorporada que puede acceder a esta información e imprime los resultados. Por ejemplo, para ver la documentación de la función incorporada len, puede hacer lo siguiente:


In [1]: help(len)
Help on built-in function len in module builtins:

len(...)
    len(object) -> integer

    Return the number of items of a sequence or mapping.


Dependiendo de su intérprete, esta información puede mostrarse como texto en línea o en alguna ventana emergente separada.


Debido a que encontrar ayuda en un objeto es tan común y útil, IPython presenta el carácter ? como una forma abreviada de acceder a esta documentación y otra información relevante:


In [2]: len?
Type:        builtin_function_or_method
String form: <built-in function len>
Namespace:   Python builtin
Docstring:
len(object) -> integer

Return the number of items of a sequence or mapping.


Esta notación funciona para casi cualquier cosa, incluidos los métodos de objeto:


In [3]: L = [1, 2, 3]
In [4]: L.insert?
Type:        builtin_function_or_method
String form: <built-in method insert of list object at 0x1024b8ea8>
Docstring:   L.insert(index, object) -- insert object before index


o incluso los propios objetos, con la documentación de su tipo:


In [5]: L?
Type:        list
String form: [1, 2, 3]
Length:      3
Docstring:
list() -> new empty list
list(iterable) -> new list initialized from iterable's items


Es importante destacar que esto incluso funcionará para funciones u otros objetos que cree usted mismo. Aquí definiremos una pequeña función con una cadena de documentos:


In [6]: def square(a):
  ....:     """Return the square of a."""
  ....:     return a ** 2
  ....:


Tenga en cuenta que para crear una cadena de documentos para nuestra función, simplemente colocamos una cadena literal en la primera línea. Debido a que las cadenas de documentos suelen ser de varias líneas, por convención utilizamos la notación de comillas triples de Python para las cadenas de varias líneas.


Ahora usaremos la marca ? para encontrar esta cadena de documentos:


In [7]: square?
Type:        function
String form: <function square at 0x103713cb0>
Definition:  square(a)
Docstring:   Return the square of a.


Este acceso rápido a la documentación a través de cadenas de documentos es una de las razones por las que debe acostumbrarse a agregar siempre dicha documentación en línea al código que escribe.


Acceder al código fuente con ??

Debido a que el lenguaje Python es tan fácil de leer, generalmente se puede obtener otro nivel de conocimiento leyendo el código fuente del objeto que le interesa. IPython proporciona un acceso directo al código fuente con el doble signo de interrogación (??):


In [8]: square??
Type:        function
String form: <function square at 0x103713cb0>
Definition:  square(a)
Source:
def square(a):
    "Return the square of a"
    return a ** 2


Para funciones simples como esta, el doble signo de interrogación puede brindar una visión rápida de los detalles subyacentes.


Si juega con esto, notará que a veces el sufijo ?? no muestra ningún código fuente: esto se debe generalmente a que el objeto en cuestión no está implementado en Python, sino en C o algún otro lenguaje de extensión compilado. Si este es el caso, el sufijo ?? da el mismo resultado que el sufijo ?. Encontrará esto particularmente con muchos de los objetos y tipos integrados de Python, por ejemplo, len de arriba:


In [9]: len??
Type:        builtin_function_or_method
String form: <built-in function len>
Namespace:   Python builtin
Docstring:
len(object) -> integer

Return the number of items of a sequence or mapping.


El uso de ? y/o ?? proporciona una interfaz potente y rápida para encontrar información sobre lo que hace cualquier función o módulo de Python.


Exploración de módulos con
finalización de tabulaciones

La otra interfaz útil de IPython es el uso de la tecla de tabulación para autocompletar y explorar el contenido de objetos, módulos y espacios de nombres. En los ejemplos que siguen, usaremos <TAB> para indicar cuándo se debe presionar la tecla Tab.


Completar tabulación del contenido del objeto

Cada objeto de Python tiene varios atributos y métodos asociados. Al igual que con la función help discutida anteriormente, Python tiene una función dir incorporada que devuelve una lista de estos, pero la interfaz de finalización de tabulación es mucho más fácil de usar en la práctica. Para ver una lista de todos los atributos disponibles de un objeto, puede escribir el nombre del objeto seguido de un punto (".") y la tecla Tab:


In [10]: L.<TAB>
L.append   L.copy     L.extend   L.insert   L.remove   L.sort     
L.clear    L.count    L.index    L.pop      L.reverse


Para reducir la lista, puede escribir el primer carácter o varios caracteres del nombre, y la tecla Tab encontrará los atributos y métodos coincidentes:


In [10]: L.c<TAB>
L.clear  L.copy   L.count  

In [10]: L.co<TAB>
L.copy   L.count


Si solo hay una opción, al presionar la tecla Tab se completará la línea. Por ejemplo, lo siguiente se reemplazará instantáneamente con L.count:


In [10]: L.cou<TAB>


Aunque Python no tiene una distinción estrictamente impuesta entre atributos públicos / externos y atributos privados / internos, por convención se usa un guión bajo anterior para denotar tales métodos. Para mayor claridad, estos métodos privados y métodos especiales se omiten de la lista de forma predeterminada, pero es posible enumerarlos escribiendo explícitamente el guión bajo:


In [10]: L._<TAB>
L.__add__           L.__gt__            L.__reduce__
L.__class__         L.__hash__          L.__reduce_ex__


En aras de la brevedad, solo mostramos las primeras dos líneas del resultado. La mayoría de estos son métodos especiales de doble subrayado de Python (a menudo denominados métodos "dunder").


Finalización de tabulación al importar

La finalización de tabulación también es útil al importar objetos de paquetes. Aquí lo usaremos para encontrar todas las posibles importaciones en el paquete itertools que comienzan con co:


In [10]: from itertools import co<TAB>
combinations                   compress
combinations_with_replacement  count


Del mismo modo, puede utilizar la función de tabulación para ver qué importaciones están disponibles en su sistema (esto cambiará según los scripts y módulos de terceros que estén visibles en su sesión de Python):


In [10]: import <TAB>
Display all 399 possibilities? (y or n)
Crypto              dis                 py_compile
Cython              distutils           pyclbr
...                 ...                 ...
difflib             pwd                 zmq

In [10]: import h<TAB>
hashlib             hmac                http         
heapq               html                husl


(Tenga en cuenta que, para abreviar, no imprimí aquí los 399 paquetes y módulos importables en mi sistema).


Más allá de la finalización de la pestaña:
coincidencia de comodines

La finalización de tabulación es útil si conoce los primeros caracteres del objeto o atributo que está buscando, pero es de poca ayuda si desea hacer coincidir los caracteres en el medio o al final de la palabra. Para este caso de uso, IPython proporciona un medio de coincidencia de comodines para los nombres que utilizan el carácter *.


Por ejemplo, podemos usar esto para listar todos los objetos en el espacio de nombres que terminan con Warning:


In [10]: *Warning?
BytesWarning                  RuntimeWarning
DeprecationWarning            SyntaxWarning
FutureWarning                 UnicodeWarning
ImportWarning                 UserWarning
PendingDeprecationWarning     Warning
ResourceWarning


Observe que el carácter * coincide con cualquier cadena, incluida la cadena vacía.


De manera similar, suponga que estamos buscando un método de cadena que contenga la palabra find en algún lugar de su nombre. Podemos buscarlo de esta manera:


In [10]: str.*find*?
str.find
str.rfind


Encuentro que este tipo de búsqueda flexible con comodines puede ser muy útil para encontrar un comando en particular al conocer un nuevo paquete o volver a familiarizarme con uno familiar.


JeshuaNomics

JeshuaNomics - DataScience es una web de divulgación donde se puede encontrar material formativo en ciencia de datos y programación estadística (R, Python y SQL).

Publicar un comentario (0)
Artículo Anterior Artículo Siguiente