6.20.5.1 Aggiunta di nuovi tipi

Per aggiungere nuovi tipi, dovrete definire una vostra classe derivata della classe Option di optparse. Questa classe possiede una coppia di attributi che definiscono i tipi di optparse: TYPES e TYPE_CHECKER.

TYPES è una tupla di nomi dei tipi; nella nuova classe derivata, definisce semplicemente una nuova tupla TYPES che si costruisce su quella standard.

TYPE_CHECKER è un dizionario che associa nomi di tipo alle funzione di controllo tipo. Una funzione di controllo tipo possiede la seguente definizione:

def check_foo(option : Option, opt : string, value : string)
              -> foo

La si può chiamare con qualsiasi nome, e fare in modo che restituisca ogni tipo voluto. Il valore restituito dalla funzione di controllo tipo può venire inserito nell'istanza OptionValues restituita da OptionParser.parse_args(), o venire passato alle funzioni di callback come parametro valore.

La vostra funzione di controllo tipo dovrebbe sollevare l'eccezione OptionValueError qualora incontrasse un qualsiasi problema. OptionValueError accetta un singolo argomento stringa, che viene passato senza trattamenti al metodo error() di OptionParser, che a sua volta prepone il nome del programma, e la stringa ``error:'' e stampa il tutto su stderr prima di terminare il processo.

Ecco un semplice esempio che dimostra come aggiungere un tipo di opzione ``complex'' per analizzare un numero complesso nello stile Python sulla riga di comando. (Questo è troppo semplice da potersi usare così com'è, perché optparse 1.3 aggiunge il supporto built-in per numeri complessi [semplicemente per completezza] ma non fateci caso.)

Per prima cosa, i necessari import:

from copy import copy
from optparse import Option, OptionValueError

Dovete definire prima il vostro controllo tipo, per potervi fare riferimento successivamente (nell'attributo di classe TYPE_CHECKER della propria classe derivata di Option):

def check_complex(option, opt, value):
    try:
        return complex(value)
    except ValueError:
        raise OptionValueError(
            "option %s: invalid complex value: %r" % (opt, value))

Finalmente, la classe derivata di Option:

class MyOption(Option):
    TYPES = Option.TYPES + ("complex",)
    TYPE_CHECKER = copy(Option.TYPE_CHECKER)
    TYPE_CHECKER["complex"] = check_complex

(Se non si fa il copy() di Option.TYPE_CHECKER, si potrebbe terminare la modificando l'attributo TYPE_CHECKER della classe Option di optparse. Questo è Python, niente ferma il programmatore tranne le buone maniere ed il buon senso.)

Questo è tutto! Adesso potete scrivere uno script che usi il nuovo tipo di opzione come un qualsiasi altro script basato su optparse, eccetto per il fatto che dovrete istruire il vostro OptionParser ad usare MyOption invece di Option:

parser = OptionParser(option_class=MyOption)
parser.add_option("-c", action="store", type="complex", dest="c")

In alternativa, potete costruire la vostra lista di opzioni e passarla a OptionParser: se non utilizzate add_option() nel modo descritto, non avrete bisogno di comunicare a OptionParser quale opzione di classe usare:

option_list = [MyOption("-c", action="store", type="complex", dest="c")]
parser = OptionParser(option_list=option_list)

Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.