Data Versão Descrição Autor  
01/04/2019 0.0.1 Criação da Folha de Estilo Lucas Vitor  

Este documento define as convenção seguidas para a programação na linguagem python que serão utilizadas no presente projeto. Ele tem como base o PEP8 – Style Guide for Python Code, porém apresenta algumas leves alterações para refletir melhor as necessidades da equipe. Obervação: este documento pode sofrer alterações, caso seja evidenciado que alguma das convenções aqui descritas não se adequam da melhor forma ao contexto do projeto.

Layout do Código

Identação

Usar 4 espaços por nível de identação (configurar tab para 4 espaços)

Como fazer:

#Com argumentos no primeira linha:
foo = long_function_name(var_one, var_two,
                         var_three, var_four)


#Adicione 4 espaços extras para distinguir argumentos do resto (caso não fique na primeira linha):
def long_function_name(
        var_one, var_two, var_three,
        var_four):
    print(var_one)


#Sem argumentos na primeira linha:
foo = long_function_name(
    var_one, var_two,
    var_three, var_four)

Como não fazer:

#Argumentos na primeira linha são proibidos quando não utilizar alinhamento vertical:
foo = long_function_name(var_one, var_two,
    var_three, var_four)

#Identação dos argumentos não se distingue do resto do código:
def long_function_name(
    var_one, var_two, var_three,
    var_four):
    print(var_one)

No caso de listas e dicionários, o fechamento deve ser feito abaixo do conteúdo, no mesmo nível da declaração da lista ou dicionário:

Como fazer:

my_list = [
    1, 2, 3,
    4, 5, 6,
]

my_dict = {
    "key1": "value1",
    "key2": "value2"
}

Como não fazer:

my_list = [
    1, 2, 3,
    4, 5, 6,]

my_dict = {
    "key1": "value1",
    "key2": "value2"}

Tamanho máximo de caracteres por linha

O tamanho máximo de caracteres por linha será de 79 caracteres.

Este número se deve a maior comodidade e adequação à maioria dos editores de texto, evitando a necessidade de scroll lateral no texto, permitindo, assim, uma visão melhor do código como um todo.

Em casos em que a linha ultrapasse o valor estipulado, a linha deverá ser quebrada (neste caso, será utilizado a continuação de linha implícita, através de parênteses, colchetes e chaves). Outra possibilidade é a utilização de barra invertida.

Exemplo:

with open('/path/to/some/file/you/want/to/read') as file_1, \
    open('/path/to/some/file/being/written', 'w') as file_2:
    file_2.write(file_1.read())

Quebra de linha em operadores binários

Caso necessário, será utilizado quebra de linha após o operador binário.

Como fazer:

income = (gross_wages +
      taxable_interest +
      (dividends - qualified_dividends) -
      ira_deduction -
      student_loan_interest)

Como não fazer:

income = (gross_wages
      + taxable_interest
      + (dividends - qualified_dividends)
      - ira_deduction
      - student_loan_interest)

Espaços em branco

Deverá existir dois espaços em branco entre as declarações de funções.

Como fazer:

def function1():
    do_something()


def function2():
    do_something_but_different()

Como não fazer:

def function1():
    do_something()

def function2():
    do_something_but_different()

Deverá existir um espaço em branco entre parágrafos de código.

Imports

Os imports são sempre colocados na parte superior do arquivo, logo após os comentários de módulos e docstrings, e antes dos módulos globais e constantes.

Os imports devem ser agrupadas na seguinte ordem:

Imports de biblioteca padrão. Imports de terceiros relacionadas. Imports específicas de aplicativo / biblioteca local.

Imports devem ser feitos em linha separadas.

Como fazer:

import os
import sys

Como não fazer:

import sys, os

Também é permitido desta forma:

from subprocess import Popen, PIPE

Aspas em Strings

Python não distigue entre aspas simples e duplas. Então por pura convenção, será utilizada aspas simples para Strings.

Espaçamento entre declarações e expressões

Evite espaçamentos nos seguintes casos:

  • Imediatamente dentro de parênteses, colchetes e chaves:
Yes: spam(ham[1], {eggs: 2})

No:  spam( ham[ 1 ], { eggs: 2 } )
  • Entre uma vírgula final e um fechamento de parênteses:
Yes: foo = (0,)

No:  bar = (0, )
  • Imediatamente antes de um vírgula, ponto e vírgula ou dois pontos:
Yes: if x == 4: print x, y; x, y = y, x

No:  if x == 4 : print x , y ; x , y = y , x
  • Imediatamente antes de abertura de parênteses:
Yes: spam(1)

No:  spam (1)
  • Imediatamente antes de indexação:
Yes: dct['key'] = lst[index]

No:  dct ['key'] = lst [index]
  • Alinhamento entre operadores:

Como fazer:

x = 1
y = 2
long_variable = 3

Como não fazer:

x             = 1
y             = 2
long_variable = 3

Comentários

Comentários que contradizem o código são piores do que comentários. Sempre priorize manter os comentários atualizados quando o código for alterado!

Comentários devem ser frases completas. A primeira palavra deve ser maiúscula, a menos que seja um identificador que comece com uma letra minúscula (nunca altere o caso dos identificadores!).

Os comentários de bloco geralmente consistem em um ou mais parágrafos construídos com sentenças completas, com cada sentença terminando em um período.

Os comentários devem seguir a língua do código.

Blocos de comentários

Os blocos de comentários devem seguir a identação do código, e cada linha do comentário de começar com # e um espaço antes do texto.

Comentários em linha

Devem ser separados em dois espaços do código, e começar com # e um espaço em branco antes do código.

Convenções de nomenclatura

  • Arquivos

Arquivos devem seguir o padrão snake case.

Exemplo:

nlu_config.yml
  • Classes

Classes devem seguir o padrão pascal case.

Exemplo:

class ClassNameHere()
  • Funções

Funções devem seguir o padrão camel case.

Exemplo:

def functionNameHere()
  • Variáveis

Variáveis devem seguir o padrão camel case.

Exemplo:

int variableNameHere
  • Constantes

Constantes devem seguir o padrão screaming snake case.

Exemplo:

int CONSTANT_NAME_HERE