Edição de Entrada Interativa e Substituição de História

Prévio Próximo

Python Logo13. Edição de Entrada Interativa e Substituição de História

Algumas versões do interpretador Python apoiam a edição da linha de entrada de corrente e substituição de história, similar às facilidades encontradas no shell Korn e no shell GNU Bash. Isso é implementado usando a biblioteca GNU Readline, que suporta edições Emacs-style e vi-style. Esta biblioteca tem sua própria documentação que não vou duplicar aqui; no entanto, os princípios são facilmente explicados. A edição interativa e história descrita aqui estão opcionalmente disponível nas versões de Unix e Cygwin do interpretador.
Este capítulo não documenta as facilidades de edição do pacote PythonWin de Mark Hammond ou o ambiente baseado em TkIDLE, distribuído com o Python. A memorização de história da linha de comando que funciona dentro caixas DOS no NT e alguns outros sabores DOS e do Windows é uma fera a mais.

13.1. Edição de Linha

Se suportada, edição de linha está ativa sempre que o interpretador imprime um prompt primário ou secundário. A linha atual pode ser editada com os caracteres convencionais de controle de Emacs. Os mais importantes deles são: C-A (control-A) move o cursor para o início da linha, C-E para o final, C-B move para uma posição à esquerda, C-F para a direita. Backspace apaga o caractere à esquerda do cursor, C-D o personagem à sua direita. C-K deleta (apaga) o resto da linha à direita do cursor, C-Y cola a linha apagada. C-underscore desfaz a última alteração feita; ele pode ser repetido para efeito cumulativo.

13.2. Substituição de História

Substituição de História funciona da seguinte maneira. Todas as linhas não-vazias de entrada emitidas são salvas em um buffer de histórico, e quando um novo prompt é dado você será posicionado em uma nova linha na parte inferior deste buffer. C-P move uma linha para cima (de volta) no buffer do histórico, C-N se move para baixo. Qualquer linha no buffer de história pode ser editada; um asterisco aparece na frente da linha para marcar uma linha como modificada. Pressionando a tecla Return passa a linha atual para o intérprete. C-R inicia uma busca para trás; C-S inicia uma busca para a frente.

13.3. Key Bindings (Ligações-chave)

Os key bindings e outros parâmetros da biblioteca Readline pode ser personalizados colocando comandos em um arquivo de inicialização chamado ~/.inputrcKey bindings têm a forma:
key-name: function-name
ou
"string": function-name
e as opções podem ser definidas com
set option-name value
Por exemplo:
# I prefer vi-style editing:
set editing-mode vi

# Edit using a single line:
set horizontal-scroll-mode On

# Rebind some keys:
Meta-h: backward-kill-word
"\C-u": universal-argument
"\C-x\C-r": re-read-init-file
Note-se que binding default para Tab em Python é para inserir um caractere Tab em vez de função de conclusão de nome de arquivo padrão da biblioteca Readline. Se você insistir, você pode substituir isso colocando
Tab: complete
em seu ~/.inputrc. (Claro, isso faz com que seja mais difícil de escrever as linhas de continuação identadas se você estiver acostumado a usar Tab para esse efeito.)
Preenchimento automático de nomes de variáveis e módulos está disponível opcionalmente. Para habilitá-lo no modo interativo do intérprete, adicione o seguinte ao seu arquivo de inicialização: [1]
import rlcompleter, readline
readline.parse_and_bind('tab: complete')

Isso vincula a tecla Tab para a função de conclusão, então apertar a tecla Tab duas vezes sugere conclusões; ela olha para nomes de instruções Python, as atuais variáveis locais e os nomes de módulos disponíveis. Para expressões pontilhadas como string.a, ela irá avaliar a expressão até a final ‘.‘ e, então, sugere conclusões a partir dos atributos do objeto resultante. Observe que isso pode executar um código definido pelo aplicativo se um objeto com um método __getattr__() fôr parte da expressão.

Um arquivo de inicialização melhor capacitado pode parecer com este exemplo. Observe que isso exclui os nomes que ele cria uma vez que eles não são mais necessários; isso é feito uma vez que o arquivo de inicialização é executado no mesmo namespace como os comandos interativos, e removendo os nomes evita a criação de efeitos colaterais no ambiente interativo. Você pode achar que é conveniente para manter alguns dos módulos importados, como o sistema operacional, que acabam por ser necessário na maioria das sessões com o intérprete.

# Add auto-completion and a stored history file of commands to your Python
# interactive interpreter. Requires Python 2.0+, readline. Autocomplete is
# bound to the Esc key by default (you can change it - see readline docs).
#
# Store the file in ~/.pystartup, and set an environment variable to point
# to it:  "export PYTHONSTARTUP=~/.pystartup" in bash.

import atexit
import os
import readline
import rlcompleter

historyPath = os.path.expanduser("~/.pyhistory")

def save_history(historyPath=historyPath):
    import readline
    readline.write_history_file(historyPath)

if os.path.exists(historyPath):
    readline.read_history_file(historyPath)

atexit.register(save_history)
del os, atexit, readline, rlcompleter, save_history, historyPath

13.4. Alternativas para Inerpretador Interativo

Esta facilidade é um enorme passo em frente em comparação com as versões anteriores do interpretador; no entanto, alguns desejos são deixados: Seria bom se a identação adequada fôsse sugerida em linhas de continuação (o parser sabe se um token indentado é necessária a seguir). O mecanismo de conclusão pode usar tabela de símbolos do intérprete. Um comando para verificar (ou mesmo sugerir) parênteses, aspas, etc. correspondentes, também seria útil.

Uma alternativa reforçada de interpretador interativo existente há algum tempo é IPython, que apresenta a conclusão de tabulação, exploração de objeto e gerenciamento avançado de história. Ela também pode ser completamente personalizada e incorporada em outras aplicações. Outro ambiente interativo aprimorado semelhante é bpython.
Notas de Rodapé
[1] Python irá executar o conteúdo de um arquivo identificado pela variável de ambiente PYTHONSTARTUP quando você iniciar um interpretador interativo. Para personalizar Python mesmo para o modo não-interativo, consulte O Modulos de Personalização.
Prévio Próximo