Beleza Pythonica

Como a beleza do seu código impacta na qualidade do seu software

> whoami

Jean, 31 anos, trabalho com TI a 14 anos, autodidata e hoje engenheiro de software na GovPredict.

(quem sou eu?)

github.com/jeanmask                             linkedin.com/in/jean3                                   @jean_o

O que é ser "Pythonico?"

"É um adjetivo que descreve uma forma de programar de acordo com a filosofia  Python. Existem muitas formas de fazer a mesma coisa em Python mas - quase sempre - há uma forma preferível, este jeito é chamado de Pythonico."

Mas código bonito não seria apenas "firula"?

> Zen do Python

Principios que guiam o desenvolvimento Python.

Bonito é melhor que feio.

Explícito é melhor que implícito.

Simples é melhor que complexo.

Complexo é melhor que complicado.

Linear é melhor do que aninhado.

Esparso é melhor que denso.

Legibilidade conta.

Casos especiais não são especiais o bastante para quebrar as regras.

Ainda que praticidade vença a pureza.

Erros nunca devem passar silenciosamente.

> Código explicito

 

# Ruim
def make_complex(*args):
    x, y = args
    return dict(**locals())

Apesar do python permitir você fazer praticamente tudo, seja o mais explicito possível!

# Bom
def make_complex(x, y):
    return {'x': x, 'y': y}

> Uma instrução por linha

 

# Ruim
print 'one'; print 'two'

if x == 1: print 'one'

if <complex comparison> and <other complex comparison>:
    # do something

Sempre que possível use apenas uma expressão por linha.

# Bom
print 'one'
print 'two'

if x == 1:
    print 'one'

cond1 = <complex comparison>
cond2 = <other complex comparison>
if cond1 and cond2:
    # do something

> Argumentos de funções e métodos

Posicional

Obrigatório sem valor padrão.

Palavra-chave

Opcional possui valor padrão.

def send_mail(mail, subject, body, *, cc=None, bcc=None):
    # something
    
send_mail(
    'alguem@gmail.com',
    'titulo do email',
    'corpo do email',
    cc=['fulano@gmail.com'],
)

> Retornando valores

def is_valid(value):
    return value and isinstance(value, str) and len(value) > 0


def fullname(name, lastname):
    if is_valid(name) and is_valid(lastname):
        fullname = f'{name} {lastname}'
    else:
        raise ValueError('You must be define name and lastname!')
     
     return fullname

Unico ponto de retorno, em python exceções podem ser definir comportamento, não apenas erros.

> Código idiomático

Escreva seu código de forma que ele faça sentido literal ao ser lido, o python oferece algumas sintaxes que ajudam nisso.

# unpacking (desempacotamento)
for index, item in enumerate(some_list):
    # alguma coisa com o index e item

# invertendo variaveis
a, b = b, a

# desempacotar valores aninhados também funciona!
a, (b, c) = 1, (2, 3)

a, *resto = [1, 2, 3]
# a = 1, resto = [2, 3]
a, *meio, c = [1, 2, 3, 4]
# a = 1, meio = [2, 3], c = 4

> Código idiomático

Escreva seu código de forma que ele faça sentido literal ao ser lido, o python oferece algumas sintaxes que ajudam nisso.

# Multiplicação de listas
quatro_nones = [None] * 4

# Criando quatro listas de listas
quatro_lists = [[] for __ in xrange(4)]

> Algumas convenções

Na busca por uma melhor forma de se fazer algo existem algumas convenções que são recomendadas:

>PEP-8

Guia de estilos básicos adotados pela comunidade Python

> Zen do Python por exemplos

Exemplos de conceito de cada parte do zen do python

Obrigado e

 

#FiqueEmCasa

deck

By Jean Oliveira Rodrigues

deck

  • 343