python

Facilitando as coisas no Debugger do Python

A função built-in dir sem parâmetros encontra tudo que existe no contexto.

Se vc estiver no PDB ou IPDB, pode acessar todas as variáveis num único comando ao invés de printar uma a uma….

print str([(_vars, eval(_vars)) for _vars in dir() if not _vars.startswith('_') and _vars not in('ipdb')]).replace('),', ')\n')

_vars

desenvolvimento, python

Python Mixins

Um Mixin é um tipo especial de herança múltipla. Há duas situações principais onde são usadas:

1 – Deseja-se prover muitas características opcionais a uma classe.
2 – Deseja-se utilizar uma característica particular em várias classes diferentes.

Exemplo:

class Story(object):
    def __init__(self, name, content):
        self.name = name
        self.content = content

class StoryHTMLMixin(object):
    def render(self):
        return (
            "<html><title>%s</title><body>%s</body></html>" %
            (self.name, self.content))

class StoryHTML(Story, StoryHTMLMixin):
    pass

print StoryHTML(u'TÍTULO', u'CONTEÚDO').render()

A classe Story guarda atributos, enquanto a classe StoryHTMLMixin “decora” atributos com marcações de HTML. Veja que a classe mixin NÃO define os atributos que ela decora: ela espera que eles tenham sido definidos em outra classe (e eles foram, na Story!). A classe mixin sozinha não parece fazer sentido. Se for criado um objeto a partir dela e invocar o método render, será gerado um erro.

Finalmente é definida StoryHTML que utiliza de herança múltipla, e acaba por agregar/compor os atributos de Story com o método render de StoryHTMLMixin.

Neste exemplo, pelo fato da classe mixin usar os atributos name e content, há forte dependência com Story. Então o mixin está criando mais uma camada de complexidade que poderia ser evitada usando herança simples (StoryHTML poderia herdar de Story e compor seus atributos com as marcações).

Mas se houver uma família de classes que segue um padrão na hora de nomear seus atributos (classes A, B, C, D, E, F e G possuem os atributos name e content), então uma mesma classe StoryHTMLMixin poderia ser agregada com qualquer uma dessas classes.

Mixins em geral não implementam um método __init__, porque sua principal razão de existir é contribuir com métodos para outras classes, e os objetos são fundamentalmente criados e inicializados por estas outras classes.

Referências:

http://stackoverflow.com/questions/533631/what-is-a-mixin-and-why-are-they-useful
http://stackoverflow.com/questions/4514803/diamond-problem-when-using-mixins-in-python
http://turing.com.br/wiki/index.php?title=Objetos_Pythonicos

aplicacoes, linux, python

Sublime no Ubuntu

Adicionando o repositório e baixando o Sublime

sudo add-apt-repository ppa:webupd8team/sublime-text-3
sudo apt-get update
sudo apt-get install sublime-text-installer

Configurando o editor

Clique em Preferences / Settings – User. Acrescente no arquivo:

"draw_white_space": "all",
"ensure_newline_at_eof_on_save": true,
"highlight_line": true,
"ignored_packages":
[
"Vintage"
],
"match_brackets_angle": true,
"rulers": [79],
"tab_size": 4,
"translate_tabs_to_spaces": true,
"auto_complete_triggers": [ {"selector": "text.html", "characters": "<_"}],
"highlight_modified_tabs": true,
"trim_automatic_white_space": true,
"font_size": 13,
"copy_with_empty_selection": false

ATENÇÃO: Adicione vírgulas entre CADA configuração, ou seja: se já houverem outras configurações mantenha a lista bem-formada.

Definindo projetos

Se necessário, clique em Project / Close Project, para garantir uma nova configuração de projetos.
A seguir clique em Project / Add Folder to Project, e escolha a pasta raíz do projeto.
Finalmente clique em Project / Save Project As…, escolha um nome para se referenciar ao projeto e salve.

Melhor salvar essas meta definições de projetos junto com as demais configurações do Sublime:
$HOME/.config/sublime-text-3/Packages/User/projetos

Agora, será possível fazer switch entre projetos.

Snippets

Snippets são palavras especiais que podem ser substituídas por trechos de comandos mais complexos, permitindo maior agilidade na hora de escrever códigos. De acordo com o tipo corrente de sintaxe, snippets específicos estarão disponíveis.

Procure por snippets na paleta de comandos ou crie os seus clicando em Tools / New Snippet… Nomeie o arquivo com o nome desejado para a definição do snippet. Opcionalmente defina o tabTrigger (que vai disparar o snippet) e o scope (que vai associar o snippet a uma sintaxe específica).

Edite espaçamentos corretamente nos snippets para tornar seu uso ainda mais eficiente. Pode-se adicionar pontos de cursor ${1}, ${2}, ${3:Dummy}. ${1} representa onde o cursor começa. Os demais pontos de cursor (${2}, ${3}, ${4}, etc…) podem ser alcançados usando-se TAB. Perceba ainda que pode-se adicionar um valor dummy para o ponto de cursor que começa selecionado quando acessado para poder ser substituído facilmente.

Meu projeto de Snippets no GitHub: https://github.com/JoseThomazini/sublime-snippets-collection

Pacotes

Pacotes são plugins que acrescentam funcionalidades ao Sublime. A pasta onde ficam instalados pode ser encontrada clicando-se em Preferences / Browse Packages… Adicione manualmente nesta pasta os pacotes desejados que ainda não estejam disponíveis através do Package Control.

Instalando Package Control
Acesse http://wbond.net/sublime_packages/package_control/installation e copie a linha de comando de instalação do gerenciador.

No Sublime clique em View / Show Console, cole a linha de comando de instalação e aperte ENTER. Reinicie.
Agora, através da paleta de comandos, procure por “install“, selecione o instalador do Package Control e escolha o plugin desejado.

Instalando outros Pacotes
Baixar através do Package Control:

Anaconda: https://github.com/DamnWidget/anaconda

Djaneiro: https://github.com/squ1b3r/Djaneiro

Emmet: https://github.com/sergeche/emmet-sublime

Em Preferences / Package Settings / Anaconda / Settings – User, acrescente no arquivo:

"pep8_ignore": ["E501"]

Teclas de Atalho Úteis

ctrl+kb: mostra/esconde a side-bar
ctrl+shift+cima: move linha atual ou bloco selecionado para cima
ctrl+shift+baixo: move linha atual ou bloco selecionado para baixo
ctrl+g: pula para a linha escolhida do documento atual
ctrl+q: fechar sublime
ctrl+i: busca incremental do texto no documento atual
ctrl+shift+f: procura texto em todos os arquivos da árvore de diretórios do projeto
ctrl+d: seleciona a palavra onde o cursor está posicionado, ou a próxima palavra idêntica à palavra já selecionada (múltiplos cursores)
alt+F3: seleciona todas as palavras idênticas à palavra onde está o cursor (múltiplos cursores)
ctrl+/: comenta a linha, usando a notação específica da sintaxe atual
ctrl+p: abre pelo nome arquivos dentro da árvore de diretórios do projeto
shift+alt+1: muda layout para apenas um grupo de documentos separados por abas
shift+alt+2: muda layout para dois grupos de documentos separados por abas
ctrl+alt+p: abre seletor para se fazer switch entre projetos
ctrl+shift+p: abre paleta de comandos
ctrl+page-up: vai para a próxima aba
ctrl+page-down: vai para a aba anterior
shift+drag com botão direito do mouse: seleciona colunas (múltiplos cursores)
esc: sai do estado de múltiplos cursores
shift+ctrl+l: define um cursor para cada linha selecionada (múltiplos cursores)
ctrl+r: abre seletor de símbolos
ctrl+1: mover cursor para grupo 1
ctrl+2: mover cursor para grupo 2
(: cerca área selecionada com parênteses
: cerca área selecionada com aspas
[: cerca área selecionada com colchetes
{: cerca área selecionada com chaves
: cerca área selecionada com apóstrofes
ctrl+clique: adiciona novo cursor no ponto selecionado (múltiplos cursores)
alt+r: torna o texto da busca interativa numa expressão regular
alt+ENTER: seleciona todas as ocorrências de uma busca por expressão regular (múltiplos cursores)
ctrl+b executa o build selecionado
ctrl+shift+t: reabrir última aba fechada

Na paleta de comandos, digite trechos de palavras para escolher comandos.
A paleta busca por padrões (e não literais), ou seja: “sypy” vai encontrar “Set Syntax: Python”.

Referências:
https://tutsplus.com/course/improve-workflow-in-sublime-text-2/
http://docs.sublimetext.info/en/latest/reference/keyboard_shortcuts_win.html
http://www.sublimetext.com/docs/2/indentation.html

desenvolvimento, linux, python

Ambientes virtuais para Python no Ubuntu

Preparando o ambiente:

sudo apt-get install python-pip
sudo apt-get install python-virtualenv
sudo apt-get install virtualenvwrapper

Adicione o controle de cache para baixar os pacotes do pip apenas uma vez:

echo 'export PIP_DOWNLOAD_CACHE=$HOME/.pip_download_cache' >> $HOME/.bashrc 

Para criar uma máquina virtual para o projeto MEU_PROJETO sem acesso aos pacotes do sistema:

mkvirtualenv -p /usr/bin/python2 MEU_PROJETO

Para criar uma máquina virtual para o projeto MEU_PROJETO com acesso aos pacotes do sistema:

mkvirtualenv -p /usr/bin/python2 MEU_PROJETO --system-site-packages

Para começar a trabalhar nesta vm, basta entrar com o comando:

workon MEU_PROJETO

Agora, todas as modificações ou instalações de pacotes ocorrem apenas para esta vm, sem interferir nas demais, ou no ambiente do host.

ATENÇÃO:
O switch para esta vm ocorreu apenas neste terminal aberto.
Se você trabalhar em múltiplos terminais (num deles você entrou no shell do python, noutro você carregou um servidor web) terá que ter executado o comando workon em cada terminal.

Instalando o Django 1.4, por exemplo:

Verifique que não temos o django ainda na nossa nova vm:

pip freeze

Agora instalamos o pacote. É preferível especificar a versão que queremos, caso contrário ele irá baixar a versão mais recente. Se quiséssemos sempre as últimas versões, não precisaríamos virtualizar ambientes.

pip install django==1.4

Verifique novamente o pip freeze. Agora ele contempla o django 1.4

Para sair de uma vm e voltar para o host:

deactivate

Agora os pacotes exibidos pelo pip freeze serão referente ao host, e não à nossa vm.

Um pacote que não controlamos pelo pip em uma vm é o próprio python.
Se você desejar usar o python 3, por exemplo, ele deve ser definido na criação da vm (no comando mkvirtualenv).

Para saber que opções de python você tem verifique com:

ls /usr/bin/python*

Para criar ambientes virtuais com alguns pacotes sendo instalados na geração:

gedit $HOME/.virtualenvs/postmkvirtualenv

Adicione no arquivo N comandos de instalação: “pip install PACOTE”