Guía de Estilo Del Código Python
Guía de Estilo Del Código Python
Bitcora
Traducciones
Tutorial de Python
Introduccin
En este documento se listan distintas convenciones utilizadas en el cdigo Python comprendido en la librera
estndar de la distribucin principal de Python. Por favor refierase al PEP que describe las guas de estilo del
cdigo C para la implementacin en C de Python[1].
Este documento es una adaptacin del ensayo original de Guido Gua de Estilo de Python[2], con algunos
aadidos de la gua de estilo de Barry[5]. En los puntos en los que exista conflicto, se aplican las reglas de
estilo de Guido para los propsitos de este PEP. Este PEP puede estar an incompleto (de hecho, es posible
que nunca llegue a completarse ).
2 de 14
Tabuladores o espacios?
Nunca mezcles tabuladores y espacios.
La forma ms popular de indentar en Python es utilizar slo espacios. La segunda forma ms popular es usar
slo tabuladores. El cdigo indentado con una mezcla de tabuladores y espacios debera reformatearse y usar
espacios exclusivamente. Cuando se invoca el intrprete de lnea de comandos de Python con la opcin -t,
este muestra avisos sobre cdigo que mezcla tabuladores y espacios. Cuando se utiliza -tt estos avisos se
convierten en errores. Estas opciones son altamente recomendables!
Para nuevos proyectos, se recomienda firmemente el uso de espacios en lugar de tabuladores. La mayora de
los editores tienen caractersticas que hacen esto bastante sencillo.
Lneas en blanco
Separa las funciones no anidadas y las definiciones de clases con dos lneas en blanco.
Las definiciones de mtodos dentro de una misma clase se separan con una lnea en blanco.
Se pueden usar lneas en blanco extra (de forma reservada) para separar grupos de funciones relacionadas.
Las lneas en blanco se pueden omitir entre un grupo de funciones con una sola lnea (por ejemplo, con un
conjunto de funciones sin implementacin).
Usa lneas en blanco en las funciones, de forma limitada, para indicar secciones lgicas.
Python acepta el caracter control-L (o lo que es lo mismo ^L) como un espacio en blanco; muchas
herramientas utilizan este caracter como separador de pginas, por lo que puedes usarlos para separar
pginas de secciones relacionadas en tu archivo.
3 de 14
Imports
Normalmente los imports deberan colocarse en distintas lneas, por ejemplo:
S:
import os
import sys
No:
import sys, os
Los imports se colocan siempre en la parte superior del archivo, justo despus de cualquier comentario
o cadena de documentacin del mdulo, y antes de las variables globales y las constantes del mdulo.
Los imports deberan agruparse siguiendo el siguiente orden:
1. imports de la librera estndar
2. imports de proyectos de terceras partes relacionados
3. imports de aplicaciones locales/imports especficos de la librera
Deberas aadir una lnea en blanco despus de cada grupo de imports.
Si es necesario especificar los nombres pblicos definidos por el mdulo con __all__ esto debera
hacerse despus de los imports.
Es muy desaconsejable el uso de imports relativos para importar cdigo de un paquete. Utiliza siempre
la ruta absoluta del paquete para todos los imports. Incluso ahora que el PEP 328 [7] est totalmente
implementado en Python 2.5, el usar imports relativos se desaconseja seriamente; los imports
absolutos son ms portables y normalmente ms legibles.
4 de 14
No:
spam( ham[ 1 ], { eggs: 2 } )
No:
if x == 4 : print x , y ; x , y = y , x
Inmediatamente antes de abrir un parntesis para una lista de argumentos de una llamada a una
funcin:
S:
spam(1)
No:
spam (1)
Inmediatamente antes de abrir un parntesis usado como ndice o para particionar (slicing):
S:
dict['key'] = list[index]
No:
dict ['key'] = list [index]
5 de 14
Ms de un espacio alrededor de un operador de asignacin (u otro operador) para alinearlo con otro.
S:
x = 1
y = 2
long_variable = 3
No:
x
= 1
y
= 2
long_variable = 3
Otras Recomendaciones
Rodea siempre los siguientes operadores binarios con un espacio en cada lado: asignacin (=),
asignacin aumentada (+=, -= etc.), comparacin (==, <, >, !=, <>, <=, >=, in, not in, is, is not),
booleanos (and, or, not).
Usa espacios alrededor de los operadores aritmticos:
S:
i = i + 1
submitted += 1
x = x * 2 - 1
hypot2 = x * x + y * y
c = (a + b) * (a - b)
No:
i=i+1
submitted +=1
x = x*2 - 1
hypot2 = x*x + y*y
c = (a+b) * (a-b)
No uses espacios alrededor del signo '=' cuando se use para indicar el nombre de un argumento o el
valor de un parmetro por defecto.
S:
def complex(real, imag=0.0):
return magic(r=real, i=imag)
No:
def complex(real, imag = 0.0):
return magic(r = real, i = imag)
Preferiblemente no:
if foo == 'blah': do_blah_thing()
do_one(); do_two(); do_three()
6 de 14
Aunque a veces es adecuado colocar un if/for/while con un cuerpo pequeo en la misma lnea, nunca
lo hagas para sentencias multi-clausula.
Preferiblemente no:
if foo == 'blah': do_blah_thing()
for x in lst: total += x
while t < 10: t = delay()
Definitivamente no:
if foo == 'blah': do_blah_thing()
else: do_non_blah_thing()
try: something()
finally: cleanup()
do_one(); do_two(); do_three(long, argument,
list, like, this)
if foo == 'blah': one(); two(); three()
Comentarios
Los comentarios que contradicen el cdigo son peores que no tener ningn comentario. Manten siempre
como prioridad el mantener los comentarios actualizados cuando cambies el cdigo!
Los comentarios deberan ser frases completas. Si un comentario es una frase o sentencia, la primera palabra
debera estar en maysculas, a menos que sea un identificador que comience con una letra en minsculas
(nunca alteres el identificador sustituyendo maysculas o minsculas!).
Si un comentario es corto, se puede omitir el punto al final. Los comentarios de bloque generalmente
consisten en uno o ms prrafos construidos con frases completas, y cada frase debera terminar con un
punto.
Deberas usar dos espacios despus de un punto de final de lnea.
Cuando escribas en ingls, aplica las reglas de Strunk y White (N.T: Los autores de "The Elements of Style",
un conocido libro de estilo de escritura en ingls).
Para los programadores en Python que no sean de pases de habla inglesa: por favor escribe tus comentarios
en ingls, a menos que ests un 120% seguro de que el cdigo nunca ser ledo por gente que no hable tu
idioma.
Comentarios de bloque
Los comentarios de bloque generalmente se aplican al cdigo que se encuentra a continuacin, y se indentan
al mismo nivel que dicho cdigo. Cada lnea de un comentario de bloque comienza con un # y un nico
espacio (a menos que haya texto indentado dentro del comentario).
Los prrafos dentro de un comentario de bloque se separan por una lnea conteniendo un nico #.
Comentarios en lnea
Utiliza comentarios en lnea de forma moderada.
Un comentario en lnea es un comentario que se encuentra en la misma lnea que una sentencia. Los
comentarios en lnea deberan separarse por al menos dos espacios de la sentencia que comentan. Deberan
comenzar con un # y un espacio.
7 de 14
Los comentarios en lnea son innecesarios y de hecho slo sirven para distraer si indican cosas obvias. No
hagas cosas como esta:
x = x + 1
# Incrementa x
Cadenas de Documentacin
Las convenciones para escribir buenas cadenas de documentacin (tambin llamados "docstrings") se
inmortalizaron en el PEP 257 [3].
Escribe docstrings para todos los mdulos, functiones, clases, y mtodos pblicos. Los docstrings no
son necesarios para mtodos no pblicos, pero deberas tener un comentario que describa lo que hace
el mtodo. Este comentario debera aparecer antes de la lnea "def".
El PEP 257 describe las convenciones para buenas cadenas de documentacin. Es importante notar,
que el """ que finaliza un docstring de varias lneas debera situarse en una lnea separada, y
preferiblemente precederse por una lnea en blanco, por ejemplo:
"""Return a foobang
Optional plotz says to frobnicate the bizbaz first.
"""
Para cadenas de documentacin de una lnea, es adecuado mantener el """ de cierre en la misma lnea.
Estas lneas deberan incluirse antes de la cadena de documentacin del mdulo, antes de cualquier otro
cdigo, y separadas por una lnea en blanco encima y debajo.
Convenciones de nombres
Las convenciones de nombres de la librera de Python son un pequeo desastre, as que nunca
conseguiremos que sea completamente consistente -- an as, aqu tenis los estndares de nombrado
recomendados en la actualidad. Los nuevos mdulos y paquetes (incluyendo los frameworks de terceras
personas) deberan acomodarse a estos estndares, pero donde exista una librera con un estilo distinto, se
prefiere la consistencia interna.
8 de 14
9 de 14
Nunca utilices los caracteres 'l' (letra ele minscula), 'O' (letra o mayscula), o 'I' (letra i mayscula) como
nombres de variables de un solo caracter.
En algunas fuentes, estos caracteres son indistinguibles de los numerales uno y cero. Cuando estes tentado
de usar 'l', utiliza una 'L' en su lugar.
Nombres de Paquetes y Mdulos
Los mdulos deberan tener nombres cortos formados en su totalidad por letras minsculas. Se puede utilizar
guiones bajos en el nombre del mdulo si mejora la legibilidad. Los paquetes Python tambin deberan tener
nombres cortos formados de letras minsculas, aunque se desaconseja el uso de guiones bajos.
Dado que los nombres de los mdulos se mapean a nombres de archivos, y algunos sistemas de ficheros no
diferencian entre maysculas y minsculas y truncan los nombres largos, es importante que los nombres de
los mdulos que se elijan sean suficientemente cortos -- esto no es un problema en Unix, pero puede ser un
problema cuando el cdigo se porta a versiones antiguas de Mac o Windows, o a DOS.
Cuando un mdulo de extensin escrito en C o C++ tenga un mdulo Python asociado que proporcione una
interfaz de ms alto nivel (por ejemplo, ms orientado a objetos), el mdulo C/C++ debera comenzar con un
guin bajo (por ejemplo _socket).
Nombres de Clases
Casi sin excepciones, los nombres de clases usan la convencin CapWords. Las clases de uso interno tienen
adems un guin bajo al principio del nombre.
Nombres de Excepciones
Dado que las excepciones deberan ser clases, se aplica la convencin relativa al nombrado de clases. De
todas formas, deberas usar el sufijo "Error" en los nombres de las excepciones (si la excepcin es realmente
un error).
Nombres de Variables Globales
(Esperamos que estas variables estn destinadas a ser usadas slo dentro de un mdulo.) Las convenciones
son prcticamente las mismas que para las funciones.
Los mdulos diseados para ser utilizados usando "from M import *" deberan usar el mecanismo __all__
para prevenir que se exporten variables globales, o bien usar la convencin antigua de aadir un guin bajo
como prefijo a dichas variables globales (puede que quieras hacer esto para indicar que estas variables son
"variables no pblicas del mdulo").
Nombres de Funciones
Los nombres de funciones deberan estar en letras minsculas, con palabras separadas mediante guiones
bajos segn sea necesario para mejorar la legibilidad.
Slo se acepta capitalizacionMezclada en contextos en los que ya se trate del estilo principal (por ejemplo
threading.py), para mantener la compatibilidad hacia atrs.
Argumentos de funciones y mtodos
Utiliza siempre 'self' como primer argumento de los mtodos de instancia.
10 de 14
11 de 14
datos.
Nota 1: Las propiedades slo funcionan en las nuevas clases.
Nota 2: Intenta mantener el comportamiento funcional libre de efectos colaterales, aunque
funcionalidad colateral como el cacheo generalmente es aceptable.
Nota 3: Evita usar propiedades para realizar operaciones que requieran de grandes clculos; el utilizar
la notacin de atributos hace que la persona que accede al atributo piense que el acceso es
(relativamente) barato en tiempo computacional.
En este caso se aplican las convenciones de nombrado de las clases, aunque deberas aadir el sufijo
"Error" a las clases excepcin, si la excepcin se trata de un error. Las excepciones que no sean
errores, no necesitan ningn sufijo especial.
Cuando lances una excepcin, utiliza "raise ValueError('mensaje')" en lugar de la forma antigua
"raise ValueError, 'mensaje'".
Se prefiere la forma con parntesis porque cuando los argumentos de la excepcin son largos o
incluyen formateo de cadenas, no necesitas usar caracteres para indicar que contina en la siguiente
lnea gracias a los parntesis. La forma antigua se eliminar en Python 3000.
Cuando captures excepciones, menciona excepciones especficas cuando sea posible en lugar de
utilizar una clausula 'except:' genrica.
Por ejemplo, utiliza:
12 de 14
try:
import platform_specific_module
except ImportError:
platform_specific_module = None
No:
try:
# Demasiado amplio!
return handle_value(collection[key])
except KeyError:
# Tambin capturar la excepcin KeyError lanzada por handle_value()
return key_not_found(key)
No:
if foo[:3] == 'bar':
La excepcin a esta norma se da si es necesario que el cdigo funcione con Python 1.5.2 (esperemos
que no lo necesites!).
13 de 14
Las comparaciones del tipo de objeto siempre deberan utilizar isinstance() en lugar de comparar tipos
directamente.
S:
if isinstance(obj, int):
No:
if type(obj) is type(1):
Cuando comprobemos si un objeto es una cadena, hay que tener en cuenta que puede que se trate de
una cadena unicode! En Python 2.3, str y unicode tienen una clase padre comn, basestring, por lo que
puedes usar:
if isinstance(obj, basestring):
En Python 2.2, el mdulo types define el tipo StringTypes para este propsito en concreto, por
ejemplo:
from types import StringTypes
if isinstance(obj, StringTypes):
Para secuencias, (cadenas, listas, tuplas), aprovecha el que las secuencias vacias son equivalentes al
falso booleano.
S:
if not seq:
if seq:
No:
if len(seq)
if not len(seq)
No:
if greeting == True:
Peor:
if greeting is True:
Referencias
[1] PEP 7, Gua de Estilo para Cdigo C, van Rossum
[2] http://www.python.org/doc/essays/styleguide.html
[3] PEP 257, Convenciones para Cadenas de Documentacin, Goodger, van Rossum
14 de 14
[4] http://www.wikipedia.com/wiki/CamelCase
[5] Gua de estilo de GNU Mailman de Barry http://barry.warsaw.us/software/STYLEGUIDE.txt
[6] PEP 20, El Zen de Python
[7] PEP 328, Imports: Multi-Line and Absolute/Relative