6.20.3.6 Conflitti tra opzioni

Se non state attenti, � facile definire delle opzioni in mutuo conflitto:

parser.add_option("-n", "--dry-run", ...)
...
parser.add_option("-n", "--noisy", ...)

(Questo � pi� facile che si verifichi se avete definita una vostra propria classe derivata di OptionParser con qualche opzione standard.)

Basandosi sull'assunto che ci� � usualmente un errore, optparse solleva in modo predefinito un'eccezione (OptionConflictError) quando questo si verifica. Dato che questo � un errore di programmazione facilmente correggibile, non dovreste tentare di catturare l'eccezione -- meglio correggere l'errore e tirare a campare.

A volte potreste volere che opzioni pi� recenti rimpiazzino deliberatamente le stringhe usate dalle opzioni pi� vecchie. Potete fare mediante la chiamata:

parser.set_conflict_handler("resolve")

che istruisce optparse a risolvere i conflitti tra opzioni in modo intelligente.

Ecco come funziona: ogni volta che aggiungete un'opzione, optparse verifica gli eventuali conflitti tra le opzioni gi� definite. Se ne trova qualcuno, chiama il meccanismo di gestione dei conflitti che viene specificato al costruttore di OptionParser:

parser = OptionParser(..., conflict_handler="resolve")

oppure tramite il metodo set_conflict_handler().

Il meccanismo predefinto di gestione dei conflitti � error.

Ecco un esempio: prima definite un insieme di OptionParser per risolvere intelligentemente i conflitti:

parser = OptionParser(conflict_handler="resolve")

Adesso aggiungete le opzioni:

parser.add_option("-n", "--dry-run", ..., help="opzione dry-run originale")
...
parser.add_option("-n", "--noisy", ..., help="sii loquace")

A questo punto optparse individua che l'opzione precedentemente definita sta gi� usando la stringa di opzione -n. Dal momento che conflict_handler == "resolve", la situazione viene risolta con la rimozione dell'opzione -n dalla precedente lista delle stringhe di opzioni. Ora, --dry-run � il solo modo per l'utente di attivare quell'opzione. Se l'utente chieder� aiuto, il relativo messaggio rifletter� questa situazione, cio�:

options:
  --dry-run     opzione dry-run originale
  ...
  -n, --noisy   sii loquace

Notate il fatto che � possibile ridurre via via le stringhe di opzione da una opzione gi� esistente, fino a che non ne sia rimasta nessuna, cos� che l'utente non abbia pi� modo di invocare l'opzione da riga di comando. In questo caso, optparse rimuove l'opzione completamente, e questa non verr� mostrata n� nel messaggio di aiuto n� altrove. Cio�, se continuiamo con il nostro OptionParser:

parser.add_option("--dry-run", ..., help="nuova opzione dry-run")

A questo punto, la prima opzione -n/--dry-run non � pi� accessibile, e quindi optparse la rimuove. Se l'utente chiede aiuto, otterr� qualcosa di simile:

options:
  ...
  -n, --noisy   sii loquace
  --dry-run     nuova opzione dry-run

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