Subsections


A. Editing interattivo dell'input e sostituzione dallo storico

Alcune versioni dell'interprete Python supportano l'editing della riga di input corrente e la sostituzione dallo storico, in modo simile ai servizi che si trovano nelle shell Korn e Bash GNU. Il tutto è implementato attraverso la libreria GNU Readline, che supporta l'editing in stile Emacs e vi. Tale libreria è dotata di documentazione propria che non si desidera duplicare qui; comunque i concetti base si possono chiarire facilmente. L'editing interattivo e lo storico qui descritti sono disponibili quali opzioni sulle versioni Unix e CygWin dell'interprete.

Questo capitolo non documenta i servizi di editing del package PythonWin di Mark Hammond o l'ambiente IDLE, basato su Tk e distribuito con Python. Il richiamo dello storico da riga di comando che funziona nelle finestre DOS e su NT, in alcune altre versioni DOS e Windows è un'altra cosa ancora.


A.1 Editing di riga

Ove supportato, l'editing della riga di input è attivo ogniqualvolta l'interprete stampa un prompt primario o secondario. La riga corrente può essere modificata usando i caratteri di controllo convenzionali di Emacs. I più importanti sono: C-A (Control-A) muove il cursore all'inizio della riga, C-E alla fine, C-B lo muove di una posizione a sinistra, C-F a destra. "Indietro" (`backspace') cancella il carattere alla sinistra del cursore, C-D il carattere a destra. C-K elimina (`kill') il resto della riga alla destra del cursore,C-Y rimette al suo posto (`yanks back') l'ultima stringa cancellata. C-trattino basso annulla l'ultima modifica effettuata; può essere ripetuto per ottenere un effetto cumulativo.


A.2 Sostituzione dallo storico

La sostituzione dallo storico funziona nel modo seguente. Il contenuto delle righe di input non vuote viene salvato in un buffer dello storico, quando viene dato un nuovo prompt si viene posizionati su una nuova riga in fondo a tale buffer. C-P si muove di una riga verso l'alto (indietro) nel buffer dello storico, C-N si muove una riga verso il basso. Qualsiasi riga presente nel buffer dello storico può essere modificata; davanti al prompt appare un asterisco per marcare la riga come modificata. Premendo il tasto Invio si passa la riga corrente all'interprete. C-R inizia una ricerca incrementale inversa; C-S inizia una ricerca in avanti.


A.3 Associazioni dei tasti

Le associazione dei tasti e alcuni altri parametri della libreria GNU Readline possono essere personalizzati inserendo i comandi in un file di inizializzazione chiamato ~/.inputrc. Le associazioni dei tasti hanno questa forma:

tasto: nome-funzione

o

"stringa": nome-funzione

e le opzioni possono essere configurate con

set nome-opzione valore

Per esempio:

# Prefererisco l'editing in stile vi:
set editing-mode vi

# Usa una singola riga per l'editing:
set horizontal-scroll-mode On

# Riassocia alcune combinazioni di tasti:
Meta-h: backward-kill-word
"\C-u": universal-argument
"\C-x\C-r": re-read-init-file

Si noti che l'associazione predefinita di Tab in Python è l'inserimento di uno spazio di TabTabulazione, invece quello di Readline è la funzione di completamento dei nomi di file. Se lo si desidera davvero, si può sostituire tale funzione a quella predefinita con:

Tab: complete

nel proprio ~/.inputrc. Naturalmente ciò renderà difficoltoso introdurre le righe di continuazione indentate se vi abituerete ad usare Tab a quello scopo.

Il completamento automatico dei nomi di variabile e modulo è disponibile come opzione. Per abilitarla nella modalità interattiva dell'interprete si aggiunga quanto segue al proprio file di avvio:A.1

import rlcompleter, readline
readline.parse_and_bind('tab: complete')

Questo associa il tasto Tab alla funzione di completamento, così premendo due volte il tasto Tab verranno suggeriti i completamenti, prendendo in esame le istruzioni Python, le variabili locali correnti e i nomi dei moduli disponibili. Per espressioni con punto come string.a, verrà valutata l'espressione fino al punto "." finale e quindi suggeriti i completamenti possibili dagli attributi dell'oggetto risultante. Si noti che potrebbe essere eseguito codice dell'applicazione ove nell'espressione comparisse un oggetto con un metodo __getattr__().

Ecco come potrebbe essere un file d'avvio più efficace. Si noti che esso cancella i nomi creati non appena non siano più necessari; la ragione è che il file d'avvio viene eseguito nello stesso spazio dei nomi dei comandi interattivi e la rimozione dei nomi evita effetti secondari negli ambienti interattivi. Può essere conveniente conservare alcuni moduli importati, come os, che torna utile nella maggior parte delle sessioni con l'interprete.

#  S'aggiunga al proprio interprete interattivo Python
#+ l'autocompletamento e una cronologia dei comandi. Occorre minimo
#+ Python 2.0 e la libreria GNU Readline.  Il tasto Esc per
#+ definizione opera l'autocompletamento (per cambiarlo, vedete la
#+ documentazione di readline).
#
#  Si copi il file in ~/.pystartup e s'imposti una variabile
#+ d'ambiente che punti ad esso: 
#+ "export PYTHONSTARTUP=/max/home/itamar/.pystartup" in bash.
#
#  Si noti che PYTHONSTARTUP *non* espande "~": bisogna specificarlo
#+ nel percorso completo della propria cartella home.

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


A.4 Commenti

Questo servizio è un enorme passo avanti rispetto alle vecchie versioni dell'interprete. Comunque restano da soddisfare alcuni desideri: sarebbe bello se sulle righe di continuazione venisse suggerita l'indentazione opportuna (il parser sa se è richiesta l'indentazione del prossimo token). Il meccanismo di completamento potrebbe usare la tabella dei simboli dell'interprete. Sarebbe anche utile un comando per controllare (o anche suggerire) parentesi e apici combacianti e altro ancora.



Footnotes

... avvio:A.1
Python eseguirà i contenuti di un file identificato dalla variabile di ambiente PYTHONSTARTUP quando si avvierà una sessione interattiva dell'interprete.
Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.