====== 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]]