From 1d415b80e1058dd340234c4cda00b5759b543a03 Mon Sep 17 00:00:00 2001 From: Diego Garcia Date: Tue, 10 Feb 2015 23:06:57 -0200 Subject: [PATCH 1/2] remove image style --- content/publicando_seu_hello_world_no_heroku.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/publicando_seu_hello_world_no_heroku.md b/content/publicando_seu_hello_world_no_heroku.md index 47b8ca59e..47b727cea 100644 --- a/content/publicando_seu_hello_world_no_heroku.md +++ b/content/publicando_seu_hello_world_no_heroku.md @@ -13,7 +13,7 @@ Category: heroku
- +

From 33be141c143224ac46160833b502a2068269ce9e Mon Sep 17 00:00:00 2001 From: Diego Garcia Date: Wed, 11 Feb 2015 08:54:04 -0200 Subject: [PATCH 2/2] add post debugging em python sem ide --- content/debugging-em-python-sem-ide.md | 243 ++++++++++++++++++++++ content/images/drgarcia1986/debugging.png | Bin 0 -> 23964 bytes 2 files changed, 243 insertions(+) create mode 100644 content/debugging-em-python-sem-ide.md create mode 100644 content/images/drgarcia1986/debugging.png diff --git a/content/debugging-em-python-sem-ide.md b/content/debugging-em-python-sem-ide.md new file mode 100644 index 000000000..655434b94 --- /dev/null +++ b/content/debugging-em-python-sem-ide.md @@ -0,0 +1,243 @@ +title: Debugging em python (sem IDE) +Slug: debugging-em-python-sem-ide +Date: 2015-02-11 11:30 +Tags: python,pdb,ipython,ipdb,debugging +Author: Diego Garcia +Email: drgarcia1986@gmail.com +Github: drgarcia1986 +Site: http://www.codeforcloud.info +Twitter: drgarcia1986 +Linkedin: drgarcia1986 +Category: debugging + + +
+ +
+
+Um dos principais motivos que ainda levam desenvolvedores Python a recorrerem a IDEs pesadas e que requerem instalação é o **debugging**. +Devs que vieram de linguagens como _DotNet_, _Java_ e _Delphi_ por exemplo, estão acostumados a IDEs super pesadas e inchadas que no final das contas, além do debugging, só servem para drenar memória RAM. +Brincadeiras a parte, não a motivos para você não dar uma chance ao **VIM** ou ao **Sublime**, pois para fazer debugging em scripts python, tudo que você precisa é o **PDB**. + + + +# PDB +O `pdb` é um módulo _buit-in_ que funciona como um console interativo, onde é posssível realizar debug de códigos python. +Nele é possível fazer um _step-by-step_ do código, verificando o valor de variaveis, definindo breakpoints, manipulando valores, etc. +É possível inclusive realizer _step-into_ em métodos. Ou seja, tudo que uma boa ferramenta de debug precisa ter. + +## Comandos +Antes de partirmos para prática, é importante conhecer alguns comandos básicos para já começar o uso do pdb de forma efetiva. + +Durante o debugging, eventualmente seu script irá _estacionar_ em pontos de paradas, possívelmente definidos por você, neste momento, os comandos a seguir poderão ser utilizados. + +### q (quit) +Sai da execução do script. + +### n (next) +Avança para a próxima linha do script. + +### p (print) +Executa o comando `print` do python, por exemplo: +```python +> /script.py(1)() +-> foo = "foo var" +(Pdb) p foo +'foo var' +``` +> Vale ressaltar que no exemplo acima, não é necessário utilizar o comando `p`, basta digitar o nome da variável e pressionar `enter`, o efeito seria o mesmo. +### c (continue) +Avança o debug até o próximo **breakpoint** ou até ocorrer uma **exception**. + +### l (list) +Lista algumas linhas do código que estão em volta da linha atual. +Por padrão serão apresentadas 11 linhas (5 a cima e 5 a baixo). + +### s (step into) +Ao realizar a navegação através do comando `n` o debug **não** irá _entrar_ em métodos que possívelmente forem invocados. +Para que o debug entre no método que está sendo invocado na linha corrente, basta trocar o comando `n`, pelo comando `s`. +```python +> /home/user/foo.py(20)() +-> foo.bar('barz') +(Pdb) s +--Call-- +> /home/user/foo.py(3)bar() +-> def bar(self, the_bar): +(Pdb) +``` + +### r (return) +Já o comando `r` libera a execução do script até sair da função atual. + +### b (breakpoint) +Cria um breakpoint em uma determinada linha ou método, por exemplo. +```python +> /script.py(1)() +(Pdb) b 21 +Breakpoint 1 at /script.py:21 +``` +No comando a cima, setamos um breakpoint na linha 21 de nosso script. +```python +> /script.py(1)() +(Pdb) b foo +Breakpoint 1 at /script.py:30 +``` +Já no exemplo acima, setamos o breakpoint para o método `foo`. +O pdb informa qual linha ele setou o breakpoint, em nosso exemplo o método `foo` está na linha 30 do script. + +### a (arguments) +O comando `a` mostra os argumentos que foram passados para a função atual. + +```python +> /home/user/foo.py(20)() +-> foo.bar('barz') +(Pdb) s +--Call-- +> /home/user/foo.py(3)bar() +-> def bar(self, the_bar): +(Pdb) a +the_bar = "barz" +``` + +### ENTER +Se você precionar o `ENTER` sem nenhum comando no pdb, ele irá repetir o último comando executado. + +## Debug na prática +Vamos utilizar um script python simples e didático como exemplo. + +```python +class NumberList(object): + def __init__(self): + self.numbers = list() + + def add(self, number): + if not isinstance(number, (int, float)): + raise TypeError + self.numbers.append(number) + + def sum(self): + result = 0 + for i in self.numbers: + result += i + return result + + +if "__main__" == __name__: + numbers = NumberList() + + numbers.add(5) + assert numbers.sum() == 5 + + numbers.add(10) + assert numbers.sum() == 15 + + print "The End" +``` +Esse script possui uma classe chamada `NumberList` que armazena uma lista de numeros e retorna a soma deles. +Além destas classe, esse script também realiza algumas operações como instaciar essa classe e realizar alguns testes de asserção. +Salve esse script em um arquivo chamado `numbers.py` para ser utilizado em nossos exemplos. + +## Modos de uso do pdb + +Na prática o pdb se assemelha bastante ao prompt interativo do python, com a diferença dos caracteres identificadores. +Enquanto que no prompt interativo do python o identificador é o `>>>`, no pdb o identificador é `(Pdb)`. +Existem algumas maneiras de usar o pdb, depende da forma como você pretende realizer o debbug. + +### pdb.py +Uma delas é através da chamada do script `pdb.py` passando como paramêtro o script para ser feito do debug, por exemplo: + +```bash +python -m pdb numbers.py +``` +Isso fará com o pdb seja iniciado na primeira linha do script `numbers.py`, no caso, a declaração da classe `NumberList()`. +Caso você execute o comando `n`, a próxima linha será o `if "__main__" == __name__:` e assim por diante. +Utilizando desta maneira, você pode verificar linha a linha do script ou _setar_ um breakpoint assim que entrar no debug, por exemplo, se você quer criar um breakpoint na execução do método `sum()` de uma instância da classe `NumberList()`, basta executar o comando `b numbers.sum`. + +```python +(venv)user@machine:~/$ python -m pdb numbers.py +> /home/user/numbers.py(4)() +-> class NumberList(object): +(Pdb) n +> /home/user/numbers.py(20)() +-> if __name__ == "__main__": +(Pdb) n +> /home/user/numbers.py(21)() +-> numbers = NumberList() +(Pdb) n +> /home/user/numbers.py(23)() +-> numbers.add(5) +(Pdb) b numbers.sum +Breakpoint 1 at /home/user/numbers.py:13 +(Pdb) +``` + +Ou para simplificar, também poderiamos setar o breakpoint pelo número da linha. + +```python +(venv)user@machine:~/$ python -m pdb numbers.py +> /home/user/numbers.py(4)() +-> class NumberList(object): +(Pdb) b 13 +Breakpoint 1 at /home/user/numbers.py:13 +(Pdb) +``` +### pdb.set_trace() +Outra forma é utilizando o método `set_trace()` do pacote `pdb`. +Com o `pdb.set_trace()` você pode definir onde será o seu breakpoint via código, por exemplo, faremos uma alteração em nosso script para setar um breakpoint no método `NumberList().sum()`. +```python +import pdb + + +class NumberList(object): + def __init__(self): + self.numbers = list() + + def add(self, number): + if not isinstance(number, (int, float)): + raise TypeError + self.numbers.append(number) + + def sum(self): + pdb.set_trace() + + result = 0 + for i in self.numbers: + result += i + return result + +""" +Resto do script omitido +""" +``` +Dessa forma, ao executar o script (sem a necessidade de ser via pdb) e passar pelo método `pdb.set_trace()` será iniciado um prompt interativo do pdb. + +```python +(venv)user@machine:~/$ python numbers.py +> /home/user/numbers.py(16)sum() +-> result = 0 +(Pdb) +``` + +## ipdb +Uma das desvantagens do prompt interativo do python é a falta de _syntax highlighting_ e _code completion_, com o pdb não é diferente, porém, assim como podemos recorrer ao [ipython](http://ipython.org/) para isso, também podemos utilizar o [ipdb](https://github.com/gotcha/ipdb). +O `ipdb` é uma espécie de wrapper para o pdb que faz uso das rotinas de debug do `IPython`. +A maneira de uso se assemelha bastante ao pdb, bastando trocar o pacote `pdb` pelo pacote `ipdb`. + +```python +import ipdb + +foo = "foo" +ipdb.set_trace() +bar = "bar" +``` + +Para instalar o ipdb basta utilizar o `pip` + +``` +pip install ipdb +``` +Com certeza recomendo o uso do `ipdb` principalmente por ser mais intuitivo. + +**Referências**
+[Documentação Oficial](https://docs.python.org/2/library/pdb.html)
+[ipdb](https://github.com/gotcha/ipdb) diff --git a/content/images/drgarcia1986/debugging.png b/content/images/drgarcia1986/debugging.png new file mode 100644 index 0000000000000000000000000000000000000000..25cb69bbb9c3f6db6913fe4af32c5a15dadd0910 GIT binary patch literal 23964 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 literal 0 HcmV?d00001