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.