====== Dicas para Python ======
Esse não é um tutorial, não é um guia, muito menos um guia completo.
São apenas minhas anotações pessoais sobre Python que podem servir como um guia de
referência rápida (Cheat Sheet).
==== Instalações ====
* Python 3 ([[https://pythonclock.org/|python2 será aposentado em 2020]])
* [[https://www.vim.org/|vim]]
* [[https://github.com/vim-syntastic/syntastic|vim-syntastic]]
* [[https://github.com/ycm-core/YouCompleteMe|vim-youcompleteme]]
* [[https://github.com/psf/black|black]]
* [[https://docs.python.org/3/library/venv.html|venv]] (equivalente ao virtualenv)
* Isso acaba já instalando o pip3
* Dentro do venv:
* [[https://pip.pypa.io/en/stable/installing/|pip via python]]\\ Gerenciador de pacotes. Dentro do venv instalará pacotes independentes por projeto ou versão de python.
* [[https://www.pylint.org/|pylint3]]\\ apenas pra separar de outras versões
* [[https://pytest.org/en/latest/|pytest3]]\\ apenas pra separar de outras versões
* Pro YouCompleteMe funcionar no Vim dentro de um venv de Python3 tive que instalar:\\ pip install future frozendict requests requests_futures
==== Configurando o ambiente ====
Como programo sempre em ambiente Linux com o editor VIM as dicas aqui são focadas nisso.
Meu arquivo de configuração do VIM (~/.vimrc) que chama o ~/.vimrc-python:
autocmd BufNewFile *.py :source ~/.vimrc-python
autocmd BufRead *.py :source ~/.vimrc-python
Meu arquivo de configuração .vimrc-python
filetype indent on
set expandtab " enter spaces when tab is pressed
set textwidth=90 " break lines when line length increases
set tabstop=4 " use 4 spaces to represent tab
set softtabstop=4
set shiftwidth=4 " number of spaces to use for auto indent
set autoindent
set backspace=indent,eol,start
let g:syntastic_python_python_exec = '/usr/bin/python3'
let g:syntastic_python_pylint_exec = '/usr/bin/pylint3'
source $VIMRUNTIME/indent/python.vim
===== Verificando código =====
=== pylint ===
* Integrado ao vim: verifica sempre que o arquivo é salvo
* Sugere:
* Melhores comandos
* Melhores sintaxes
* Erros de sintaxe
* Documentação
* etc
* Analise se não é melhor instalar via pip dentro do venv, assim cada ambiente fica com o pylint correto direto (python2 / 3)
Uso:
* Integrado ao vim
* Via linha de comandos:pylint3 exemplo.py
* Para obter os códigos das mensagens:pylint3 --msg-template='{msg_id}:{line:3d},{column}: {obj}: {msg}' exemplo.py
* Para inibir determinada mensagem:
* No arquivo (a partir da linha):# pylint: disable=C0103
* ou: # pylint: disable=invalid-name
* Numa linha:var = 3 # pylint: disable=C0103
* Se precisar reabilitar (a partir da linha):# pylint: enable=C0103
* Em todos os arquivos:
* Edite o arquivo de configuração do pylint, item ''disable='' seção ''[MESSAGES CONTROL]''
* Se o arquivo não existir:pylint3 --generate-rcfile exemplo1.py > ~/.pylintrc
=== black ===
* Só pra formatação
* Uso independente
* Não destrutivo
===== Testes com pytest =====
A ideia é que você crie um programa que vá testar seu código. O pytest é uma ferramenta que vai facilitar isso.
Exemplo de código:
def bubble_sort(lista):
"""Ordenação via algorítimo Bubble Sort"""
for passnum in range(len(lista)-1, 0, -1):
mudou = False
for i in range(passnum):
if lista[i] > lista[i+1]:
lista[i], lista[i+1] = lista[i+1], lista[i]
print(lista)
mudou = True
if not mudou:
return lista
return lista
Exemplo de programa que testa o código:
# -*- coding: UTF-8 -*-
import pytest
import semana5
class Testa_semana5_bubble():
@pytest.mark.parametrize("lista, resultado", [
([5, 1, 4, 2], [1, 2, 4, 5]),
([12, 13, 14, 11], [11, 12, 13, 14]),
([12, 13, -2, 14, 11], [-2, 11, 12, 13, 14]),
])
def testes(self, lista, resultado):
assert semana5.bubble_sort(lista) == resultado
Para realizar o teste chamamos o programa que testa via pytest:
$ pytest-3 testa.py
=== test session starts ===
platform linux -- Python 3.6.8, pytest-3.3.2, py-1.5.2, pluggy-0.6.0
rootdir: /tmp/curso_python/week5_testes_automatizados, inifile:
plugins: pylint-0.8.0
collected 3 items
testa.py ... [100%]
=== 3 passed in 0.03 seconds ===
===== Venv =====
Referência [[https://www.python.org/dev/peps/pep-0405/|sobre ambientes virtuais]] e [[https://packaging.python.org/tutorials/installing-packages/#creating-virtual-environments|sobre gerenciamento de pacotes com venv]] no python.
* Criando um virtualenv:$ python3 -m venv
# ou
$ pyvenv
* Ativando o virtualenv:$ source /bin/activate
==== Dentro de um virtualenv ====
* Obtendo o que é usado num projeto:$ pip freeze
* Pode se salvar a saída disso num arquivo para incluir no projeto como requirements.txt
=====pexpect/pxssh=====
O pexpect é o equivalente ao programa original "[[https://en.wikipedia.org/wiki/Expect|expect]]", feito em tcl, muito usado em programação shell script. O pexpect é particularmente útil para programadores que lidam com infra-estrutura, pois fornece um meio de automatizar aplicativos que o shell diretamente não consegue, como ssh, telnet, etc, em outras palavras, programas que se apropriam do terminal e que não aceitam parâmetros pela stdin.
* [[https://pexpect.readthedocs.io/en/stable/api/pexpect.html|pexpect]]: uso geral
* [[https://pexpect.readthedocs.io/en/stable/api/pxssh.html|pxssh]]: uso para sessões de ssh
===== Django =====
===== Recomendações PEP =====
===== Referências externas =====
* [[https://wiki.python.org.br/GuiaDeEstilo]]