/ python

Emacs como entorno de desarrollo para python

Emacs es una potente herramienta para desarrollar en python, en esta ocasión voy a explicar las herramientas que uso para desarrollar en python con emacs.

Se esta asumiendo un conocimiento básico de emacs: instalación de paquetes y configuración

Los paquetes usados son:

Python mode

Emacs por defecto viene con python.el un modo que trae cierta funcionalidad como coloreado de sintaxis y también permite ejecutar una consola de python dentro emacs usando la función run-python

Elpy

Elpy es un entorno de desarrollo para python, entre las funcionalidades que ofrece podemos encontrar, autocompletado de código, ejecución de tests, ir a la definición, etc.

Instalación y configuración

Podemos instalar Elpy desde Melpa con

M-x package-install RET elpy RET

La configuración mínima que necesitamos para poder usar elpy una vez instalado es:

(elpy-enable)

Con esto cada vez que editemos una archivo y tengamos habilitado python-mode podremos usar elpy.

Para poder usar las funcionalidades de elpy necesitamos algunas librerias de python, para instalarlas globalmente ejecutamos

pip install --user elpy jedi flake8 importmagic autopep8 yapf epc

Entornos virtuales

Elpy tiene como dependencia el paquete pyvenv que nos permite trabajar con entornos virtuales.

Cuando estemos trabajando dentro de un entorno virtual debemos instalar también estas librerias dentro del entorno virtual.

Elpy también nos permite elegir el entorno virtual con el que vamos a trabajar para esto ejecutamos:

M-x pyvenv-workon

Este comando nos mostrará una lista de los entornos virtuales disponibles.

Pyvenv trabaja en conjunto con virtualenvwrapper ya que usa el contenido de la variable $WORKON_HOME para buscar los entornos virtuales disponibles.

Cuando se activa un entorno virtual esto afecta también a la consola python, de modo que si abrimos una consola de python esta tendrá cargada la configuración del entorno virtual activo.

Si teniamos una consola abierta y luego activamos un entorno, debemos cerrar la consola y volverla a abrir.

Autocompletado

Elpy tiene también como dependencia a company-mode, el cual es un framework de autocompletado de emacs que no solo trabaja con python sino con diferentes lenguajes.

El autocompletado se actuvivará mientras escribamos o mediante la combinación de teclas M-TAB

Funciones

Podemos acceder a todas las funciones disponibles desde el menú Elpy o presionando M-x y buscando por el nombre.

Ejecutar un archivo

Con C-c C-c podemos enviar el contenido del buffer actual a una consola de python, se usará el entorno virtual que se tenga activado o en su defecto la instalación global del sistema.

Ver la documentación

Para ver la documentación de un método, clase, función, etc, usamos la combinación de teclas C-c C-d, esto abrirá una nueva ventana donde nos mostrará el contenido de la documentación.

La documentación que nos muestra es la que se encuentra en los docstrings definidos en el código fuente.

Ir a la definición

Para ir a la definición de una clase, función, etc, elpy nos provee de dos funciones: elpy-goto-definition y elpy-goto-definition-other-window, ambas hacen lo mismo solo que la segunda abre una nueva ventana para ver el código fuente mientras que la primera usa la ventana actual.

Correr tests

Mediante la combinación C-c C-t podemos ejecutar el test sobre el que se encuentre el cursor, elpy trabaja de la siguiente forma:

Supongamos que tenemos el siguiente código:

# test_example.py
import unittest


class MyTestCase(unittest.TestCase):

    def test_1(self):
        self.assertEqual(1, 1)

    def test_2(self):
        self.assertTrue(2 > 1)


class AnotherTestCase(unittest.TestCase):

    def test_3(self):
        self.assertEqual(1, 1)

La ejecución de los tests se puede dar en estos casos:

  • Si ubicamos el cursor dentro de test_1 y ejecutamos C-c C-t se ejecutará solo ese test.
  • Si nos ubicamos en la definición de MyTestCase, se ejecutarán test_1 y test_2, es decir todos los tests que pertenezcan a esa clase.
  • Si nos ubicamos en cualquier lugar del archivo test_example.py se ejecutarán todos los tests de ese archivo.
  • Si ejecutamos C-c C-t en cualquier archivo que no empiece por test_, es decir que no se una archivo de tests, se ejecutarán todos los tests que pertenezcan al proyecto.

En este caso se esta usando unittest que es el framework de testing que viene en la librería estandar de python, elpy también puede trabajar con diferentes frameworks para lo cual tiene configurado diferentes comandos, estos se pueden elegir con M-x elpy-set-test-runner, el cual nos da las siguientes opciones:

  • Unittest Discover
  • Django Discover
  • Nose
  • py.test
  • Twisted trial

Auto import

Elpy nos permite importar módulos de forma sencilla mediante la función elpy-importmagic-add-import a la cual accedemos mediante C-c RET, solo debemos posicionar el cursor en la nombre del módulo, clase o función a importar y elpy nos mostrará una lista con las opciones disponibles, ya que pueda darse el caso de que existan varios módulos con el mismo nombre en diferentes paquetes.

Elpy usa la libreria de python importmagic que también permite ordenar las importaciones de acuerdo a la PyCodeStyle, eliminar importaciones que no se usen, etc; usando la función elpy-importmagic-fixup.

Revisión de código

Por defecto elpy trabaja con Flymake para la revisión de código, en este caso vamos a usar Flycheck que es un paquete que tiene soporte para muchos lenguajes y que se integra con elpy de forma fácil, este paquete tiene mas funcionalidades que Flymake, podemos revisar una comparación aquí.

Instalamos Flycheck con M-x package-install RET flycheck RET y agregamos el siguiente código a nuestro init.el para habilitar flycheck globalmente:

(global-flycheck-mode)

Para quitar Flymake de la configuración de Elpy y sustituirlo con Flycheck usamos el siguiente código:

(when (require 'flycheck nil t)
  (setq elpy-modules (delq 'elpy-module-flymake elpy-modules))
  (add-hook 'elpy-mode-hook 'flycheck-mode))

Flycheck usa la librería de python flake8 para revisar el código y nos mostrará los errores de diferentes formas:

  • Poniendo una marca en la parte izquierda del buffer.
  • Subrayando el código con error.
  • Mostrando los errores en otro buffer en tiempo real.

Snippets

YASnippet también es una dependencia de elpy por lo que viene instalado junto con elpy solo debemos activarlo globalmente con:

(require 'yasnippet)
(yas-global-mode 1)

YASnippet permite usar snippets como crear una clase, un método, un test, etc, simplemente escribiendo algunas letras clave y presionando la tecla TAB, lo que generará el código del snippet y nos permite navegarlo para completarlo según nuestras necesidades.

Podemos ver los snippets disponibles desde el menu de YASnippet, asi como también podemos crear nuevos snippets.