-
Notifications
You must be signed in to change notification settings - Fork 21
pep8
- Indentação
- Tabulação
- Comprimento máximo de linhas
- Linhas em branco
- Imports
- Expressões
- Argumentos
- Múltiplos comandos
- Armazenamento de funções
- Nomes
- Identificadores
- Recomendações
- 4 espaços por nível de identação.
-
Nunca misture tabulações e espaços.
-
A forma mais popular de indentar código em Python é somente com espaços.
-
Limite de linhas de 79 colunas ou caracteres.
-
Caso algo passe de 80, quebre com uma barra invertida ** e continue na linha de baixo no mesmo nível de identação.
class Function(Blob):
def __init__(self, width, height, color='black',
emphasis=None, highlight=0):
if width == 0 and height == 0 and \
color == 'red' and emphasis == 'strong' or \
highlight > 100:
raise ValueError, "sorry, you lose"
- Tente ao máximo armazenar condicionais complexos ou fluxos complexos em variáveis ou métodos para simplifica-lá.
-
Separe funções e definições de classe com duas linhas em branco.
-
Métodos dentro de uma classe devem ser separados com uma única linha em branco.
-
Quando linhas em branco são usadas para separar métodos, deve haver também uma linha em branco entre a linha class e o primeiro método da classe ou seus atributos.
-
Use linhas em branco para separar blocos lógicos dentro de métodos e funções.
- Imports devem sempre ser feitos em linhas separadas, por exemplo:
# Wrong
import sys, os
# Correct
import sys
import os
from types import StringType, ListType
-
Imports devem ser sempre colocados no topo do arquivo, logo depois de quaisquer comentários ou docstrings, e antes de constantes ou globais. Eles devem ser agrupados seguindo a ordem:
- módulos da biblioteca padrão
- módulos grandes relacionados entre si (por exemplo, todos os módulos de e-mail usados pela aplicação)
- módulos específicos da aplicação
-
Quando importar uma classe de um módulo de mesmo nome, não há problemas em usar:
from MyClass import MyClass
from foo.bar.YourClass import YourClass
- No entanto, se isso causar conflitos com nomes, use o exemplo abaixo, mas somente se tiver conflito:
import MyClass
import foo.bar.MyClass
# Wrong:
food_list( meat[ 1 ], { eggs: 2 } )
if x == 4 :
if(x == 4):
food_list (1)
dictionary ['key'] = my_list [index]
x = 2
long_variable = 3
# Correct:
food_list(meat[1], {eggs: 2})
if x == 4:
if x == 4:
food_list(1)
dictionary['key'] = my_list[index]
x = 2
long_variable = 3
-
Sempre circunde os seguintes operadores binários com um único espaço de cada lado:
$=, ==, <, >, !=, <>, <=, >=, in, not in, is, and, or, not$ -
Para qualquer operação de
$+, -, /, *, //, %, ...$ use espaços entre os operadores. -
Não use espaços entre o parentese e a operação ou entre parenteses aninhados:
$((x * y) + (x + y))$ -
Use sempre variáveis em minúsculo (x) evite misturar maiúsculo com minúsculo, por exemplo, x com X.
-
Exemplo de uma boa expressão:
x = ((x + y) * (x * z)) / ((x // 2 - x % 2) + y)
-
Não use espaços ao redor do sinal de igual (=) quando usado para indicar um valor padrão de um argumento.
-
Use espaço entre uma virgula e o próximo argumento
# Wrong:
def subtration(x,y = 0):
return x - y
# Correct:
def subtration(x, y=0):
return x - y
- Não use múltiplos comandos na mesma linha
# Errado:
if name == 'joao': do_something()
do_one(); do_two(); do_three()
# Certo:
if name == 'joao':
do_something()
do_one()
do_two()
do_three()
- Para inserir uma função em outra função, evite usar o lambda a menos que seja uma expressão muito simples e se usar armazene em uma variável antes.
# Certo:
def subtration(x, y):
return x - y
sum = (lambda x, y: x + y)
def math(subtration(x, y), sum(x, y), ...):
# Implementação
- Para casos do range(inicio, fim, incremento) use uma variável para armazenar o fluxo e use constantes para armazenar os número mágicos:
INITIAL = 0
END = 20
INCREMENT = 2
numbers = range(INITIAL, END, INCREMENT)
for number in numbers:
print(number, end=' ')
Os pacotes devem também seguir a mesma base dos módulos, totalmente_em_minúsculas e snake_case.
-
Módulos devem ter nomes totalmente_em_minúsculas e snace_case.
-
Módulos que contenham uma única classe podem ter o mesmo nome da classe (como no módulo StringIO, por exemplo).
-
Como nomes de módulos são mapeados para nomes de arquivos, e alguns sistemas de arquivo não apenas desprezam maiúsculas e minúsculas como também reduzem o comprimento do nome, é importante que eles sejam escolhidos de forma a serem curtos e não entrar em conflito com outros módulos. Isso não é um problema em sistemas Unix ou Linux, mas pode ser um problema se o código for usado em Mac ou Windows.
- Quase sem exceção, nomes de classe devem usar o padrão de PalavrasComeçandoPorMaiúscula, exceto no caso de classes para uso interno, que devem começar com um underscore.
-
Funções globais: Exportadas por um módulo podem usar tanto o padrão PalavrasComeçandoPorMaiúscula, quanto totalmente em minúsculas ou minúsculas_separadas_por_underscore). Não há nenhuma preferência clara, mas o primeiro estilo costuma ser mais usado para funções que provêm mais funcionalidade, enquanto o segundo é usado por funções mais simples.
-
Variáveis Globais: Variáveis globais devem ser usadas somente dentro do módulo. As convenções são as mesmas para funções. Módulos que são projetados para ser usados com 'from M import *' devem ter suas globais com um underscore como prefixo, para evitar que sejam exportadas.
- Vale o mesmo para as funções. Use dois underscores quando for importante que apenas a classe atual acesse um atributo. (mas tenha em mente que isso não torna o método realmente privado.
-
Nomes de variáveis/atributos deve ser totalmente_em_minusculo e snake_case
-
Atributos privados devem ter dois underscores no começo e nenhum no fim, apenas a classe atual acesse.
-
Atributos não-públicos devem ter um underscore no começo e nenhum no fim, evita de serem exportadas.
-
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.
-
Nunca use os caracteres 'l' (L minúsculo), 'O' (o maiúsculo) ou 'I' (i maiúsculo) sozinhos como nomes de variáveis. Em algumas fontes, esses caracteres são indistinguíveis dos números um e zero. Quando tentado a usar somente 'l', use 'L'.
-
Adicionalmente, as seguintes formas de usar underscores antes ou depois do identificador são reconhecidas.
-
_underscore_no_inicio: costuma indicar que o atributo é de uso interno. ("from M import *" não importa objetos cujos nomes comecem com _ )
-
underscore_no_fim_: usado para evitar conflitos com palavras-chave.por exemplo: "Tkinter.Toplevel(master, class_='ClassName')".
-
__dois_underscores_no_início: atributo privado da classe.
-
__dois_underscores_no_início_e_no_fim__: atributos ou objetos especiais, como __init__ , __import__ ou __file__ . As vezes estes podem ser definidos pelo usuário para disparar alguma ação especial (sobrecarga de operadores, por exemplo).
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:
class MessageError(Exception):
"""
Base class for errors in the email package.
"""
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:
# Wrong
if foo[:3] == 'bar':
# Correct
if foo.startswith('bar'):
Comparações de tipo de objetos devem sempre usar isinstance() ao invés de comparar tipos diretamente. Exemplo:
# Wrong
if type(obj) is type(1):
# Correct
if isinstance(obj, int):
Com sequências (strings, listas, tuples), tenha em mente o fato de que, quando vazias, elas são falsas em um contexto booleano, portanto, "if not sequence" ou "if sequence" são preferíveis a "if len(sequence)" ou "if not len(sequence)".
Não compare valores booleanos com True e False usando ==
# Wrong
if greeting == True:
# Correct
if greeting:
- Folha de estilo - PEP8<\li>
- Product Backlog
-
Release 01
- Sprint01
- Sprint02
- Sprint03
- Sprint04
- Sprint05
Release 02
- Sprint06
- Sprint07
- Sprint08
- Sprint09
- Sprint10
- Sprint11
- Métricas GQM
- Relatório de fechamento do projeto
- Fotos