GuiaDeEstilo

PEP 8 - Guia de Estilo Para Python

Este artigo é uma tradução livre da PEP 8 - Style Guide for Python Code, de autoria de GuidoVanRossum (<guido at python.org>, referenciado também como GvR) e Barry Warsaw (<barry at python.org>), disponível em http://www.python.org/peps/pep-0008.html.

Introdução

Este documento oferece convenções para o código Python compreendido pela biblioteca padrão que acompanha a distribuição. Há outro documento semelhante 1 que trata do estilo para o código em C usado na implementação do interpretador e nas extensões que compõe a biblioteca padrão.

O conteúdo deste documento é uma adaptação do artigo original Python Style Guide, de GuidoVanRossum, com alguns acréscimos retirados do guia de estilo de Barry Warsaw. Onde houve conflitos, as regras de GvR foram mantidas.

Uma Consistência Tosca é o Bicho-Papão das Pequenas Mentes

O propósito de um guia de estilo é manter a consistência. Consistência em relação a esse guia é importante. Consistência em relação a outros detalhes de um projeto é mais importante. Consistência em relação a um módulo ou função é ainda mais importante.

Mais importante ainda: saiba quando ser inconsistente - algumas vezes, as regras deste guia simplesmente não se aplicam. Em caso de dúvida, use seu melhor julgamento. veja outros exemplos e decida o que fica melhor. E não hesite em perguntar!

Duas boas razões para quebrar uma regra:

Formatação do Código

   1     class Rectangle(Blob):
   2 
   3         def __init__(self, width, height,
   4                      color='black', emphasis=None, highlight=0):
   5             if width == 0 and height == 0 and \
   6                color == 'red' and emphasis == 'strong' or \
   7                highlight > 100:
   8                 raise ValueError, "sorry, you lose"
   9             if width == 0 and height == 0 and (color == 'red' or
  10                                                emphasis is None):
  11                 raise ValueError, "I don't think so"
  12             Blob.__init__(self, width, height,
  13                           color, emphasis, highlight)

incorreto:

   1 import sys, os

correto:

   1 import sys
   2 import os

Mas não há problema algum em usar:

   1 from types import StringType, ListType

   1 from MyClass import MyClass
   2 from foo.bar.YourClass import YourClass

   1 import MyClass
   2 import foo.bar.YourClass

   1 spam( ham[ 1 ], { eggs: 2 } )

Sempre escreva assim:

   1 spam(ham[1], {eggs: 2})

   1 if x == 4 : print x , y ; x , y = y , x

Sempre escreva assim:

   1 if x == 4: print x, y; x, y = y, x

   1 spam (1)

Sempre escreva:

   1 spam(1)

   1 dict ['key'] = list [index]

Sempre escreva:

   1 dict['key'] = list[index]

   1 x             = 1
   2 y             = 2
   3 long_variable = 3

Escreva:

   1 x = 1
   2 y = 2
   3 long_variable = 3

   1 i = i+1
   2 submitted = submitted + 1
   3 x = x*2 - 1
   4 hypot2 = x*x + y*y
   5 c = (a+b) * (a-b)
   6 c = (a + b) * (a - b)

   1 def complex(real, imag=0.0):
   2     return magic(r=real, i=imag)

Não faça:

   1 if foo == 'blah': do_blah_thing()
   2 do_one(); do_two(); do_three()

E sim:

   1 if foo == 'blah':
   2     do_blah_thing()
   3 
   4 do_one()
   5 do_two()
   6 do_three()

Comentários

Comentários que contradizem o código são piores do que nenhum comentário. Sempre tenha como prioridade manter os comentários atualizados com as mudanças no código! Comentários devem sempre ser frases completas e sua primeira letra deve ser maiúscula, a menos que ele comece com um identificador que começa com uma letra minúscula.

Se um comentário for curto, o ponto final deve ser omitido. Comentários grandes normalmente consistem de um ou mais parágrafos e sentenças completas, estas sim devem terminar com ponto.

Você deve usar dois espaços depois do ponto final de uma frase, permitindo que o Emacs ajuste a linha de maneira consistente.

Programadores de países que não têm o inglês como língua nativa: escrevam seus comentários em inglês, a menos que você tenha 120% de certeza de que o código jamais será lido por pessoas que não falam sua língua.

Comentários em bloco devem ser indentados no mesmo nível do código a que se referem. Cada linha deve começar com # e um espaço (a menos que o texto dentro do comentário seja indentado). Parágrafos dentro de um bloco devem ser separados por uma linha contendo uma única tralha #. O bloco inteiro deve ser separado por uma linha em branco no topo e embaixo.

Comentários na mesma linha devem ser usados esporadicamente. Devem ser separados do comando por pelo menos dois espaços. Como outros comentários, devem começar com uma tralha e um espaço. Não faça comentários em coisas óbvias. Eles distraem mais do que ajudam.

Docstrings

Escreva docstrings para todo módulo, função, classe e método público. Elas não são necessárias para métodos "privados", mas é recomendável ter um comentário que explique o que ele faz. Este comentário deve estar logo após a declaração.

A PEP 257 descreve as convenções usadas para docstrings. As mais importantes a lembrar são que deve sempre usar aspas triplas (string multiline) mesmo que a dosctring ocupe apenas uma linha (facilita uma possível expansão posterior) e que as aspas triplas que finalizam uma dosctring em múltiplas linhas deve estar em uma linha separada.

   1 """Return a foobang
   2 
   3 Optional plotz says to frobnicate the bizbaz first.
   4 """

Controle de Versão

Se você utiliza um cabeçalho para RCS ou CVS nos seus arquivos de código, faça como da seguinte forma:

   1 __version__ = "$Revision: 1.20 $"
   2 # $Source: /cvsroot/python/python/nondist/peps/pep-0008.txt,v $

Estas linhas devem ser incluídas logo após as docstrings do módulo, antes de qualquer código, separadas por uma linha em branco acima e abaixo.

Nomes e Identificadores

As convenções usadas em nomes na biblioteca padrão são um pouco bagunçadas e díficilmente vamos conseguir torná-las consistentes. Mesmo assim, vamos a algumas regras.

Atributos privados devem ter dois underscores no começo e nenhum no fim. Atributos não-públicos devem ter um underscore no começo e nenhum no fim.

Atributos públicos não devem ter underscores nem no começo, nem no fim, a menos que eles entrem em conflito com palavras reservadas, caso em que um único underscore no fim é preferível a um no começo, ou a uma pronúncia diferente, como class_ ao invés de klass.

Recomendações ao Programar

Comparações com singletons, como None, False e True devem sempre ser feitas com "is" ou "is not". Além disso, cuidado para não escrever "if x" quando o que você deseja é "if x is not None", como ao testar se uma variável ou argumento que tem um valor padrão de None, teve outro valor atribuído.

Classes são sempre preferidas à strings, como em exceptions. Módulos ou pacotes devem definir sua própria classe-exception base, que deve ser uma subclasse da classe Exception. Sempre inclua uma docstring. Exemplo:

   1 class MessageError(Exception):
   2     """Base class for errors in the email package."""

Use métodos do objeto string ao invés do módulo string, a menos que seja exigida compatibilidade com versões de Python anteriores à 2.0. Os métodos são muito mais rápidos e têm a mesma API de strings Unicode.

Evite fatiar strings quando verificando prefixos ou sufixos. Use os métodos startswith() e endswith(), que são mais eficientes e menos sujeitos a erro. Por exemplo:

Não use:

   1 if foo[:3] == 'bar':

E sim:

   1 if foo.startswith('bar'):

A exceção é se existir a necessidade do seu código de funcionar com versões de Python anteriores à 1.5.2.

Comparações de tipo de objetos devem sempre usar isinstance() ao invés de comparar tipos diretamente. Exemplo:

Não use:

   1 if type(obj) is type(1):

E sim:

   1 if isinstance(obj, int):

Quando estiver verificando se o objeto é uma string, lembre-se que ele também pode ser uma string unicode! Em Python 2.3, str e unicode têm uma classe base em comum, basestring, então você pode simplesmente escrever:

   1 if isinstance(obj, basestring):

Em Python 2.2 o módulo types tem o tipo StringTypes para o mesmo propósito:

   1 from types import StringTypes
   2 if isinstance(obj, StringTypes):

Com seqüências (strings, listas, tuples), tenha em mente o fato de que, quando vazias, elas são falsas em um contexto booleano, portanto, "if not seq" ou "if seq" são preferíveis a "if len(seq)" ou "if not len(seq)".

Não use strings que dependam de uma quantia significativa de espaços no começo ou no fim. A quantidade desses espaços é visualmente indistinguível e alguns editores até mesmo a ajustam.

Não compare valores booleanos com True e False usando == (o tipo Bool é novo em Python 2.3)

Não use

   1 if greeting == True:

E sim

   1 if greeting:

Referências

  1. PEP 7, Style Guide for C Code, van Rossum
  2. http://www.python.org/doc/essays/styleguide.html

  3. PEP 257, Docstring Conventions, Goodger, van Rossum
  4. http://www.wikipedia.com/wiki/CamelCase

  5. Barry's GNU Mailman/mimelib style guide


Traduzido por PedroWerneck

  1. PEP 7, Style Guide for C Code, van Rossum (1)

GuiaDeEstilo (editada pela última vez em 2015-10-19 13:00:34 por RodolfoSilva)