2013-05-31 3 views
17

Sto utilizzando docopt in un esempio per un modulo su cui sto lavorando, e tutti i valori di default delle opzioni sono a lavorare tranne uno. Ho modificato tutto il codice che contiene e circonda l'opzione cercando di identificare il problema, ma non avrà un valore predefinito!Perché la mia opzione docopt non ha il suo valore predefinito?

Opzioni per il mio blocco si presenta così:

Options: 
    --help      Show this message and exit 
    --version     Show version info and exit 
    -w WIDTH --width=WIDTH  The out to out width of the deck (feet) [default: 73] 
    -g GIRDERS --girders=GIRDERS The number of girders [default: 8] 
    -h HEIGHT --height=HEIGHT The height of the girders (inches) [default: 56] 
    -t THICK --thick=THICK  The deck thickness (inches) [default: 8] 
    -a ADIM --adim=ADIM   The "A" dimension, max deck thick @ CL girder [default: 12] 
    -l LSLP --leftslope=LSLP  The left-hand deck slope (ft/ft) [default: -0.02] 
    -r RSLP --rightslope=RSLP The right-hand deck slope (ft/ft) [default: -0.02] 
    -c --center     Indicates pivot point is at center of bridge 
    -o OFFSET --offset=OFFSET The offset of pivot point from center [default: 0] 

L'opzione girders mai ha un valore di default!

ho riletto this question più volte, ma sembra non correlato.

+10

la mia ipotesi: ci deve essere almeno * 2 * spazi prima di ogni descrizione di opzione – jfs

+1

La mia ipotesi anche - Ho avuto lo stesso problema, vedere http://stackoverflow.com/questions/13995352/why-are-defaults-not -appearing-in-my-riga di comando-argomento-dizionario-da-docop/20283560 # 20283560 – hargriffle

risposta

24

Così per il suggerimento in altra domanda ho clonato il repo docopt e installato la punta corrente, con effetto pari a zero. Ora che ho avuto il codice sorgente ho deciso di fare un po 'di debug e vedere se riuscivo a trovare il problema.

On line 200 nel metodo parse sulla classe opzione è l'espressione regolare utilizzata per afferrare i valori di default:

matched = re.findall('\[default: (.*)\]', description, flags=re.I)

Dopo aver stampato un gruppo di variabili circostanti Ho trovato che il valore description Vars è stato un stringa vuota. Ecco la linea che imposta la descrizione:

options, _, description = option_description.strip().partition(' ')

La parte che ha attirato la mia attenzione è stata questa: .partition(' '), che è due spazi. Così, dopo aver aggiornato il mio codice con successo mi dirigo di nuovo ai documenti e la ricerca di "spazi": https://github.com/docopt/docopt#option-descriptions-format sesto proiettile:

"Utilizzare due spazi per separare le opzioni con la loro descrizione informale"

TL; DR RTFM (o almeno il codice).

Bonus punta: docopt capisce descrizioni multilinea, in modo da poter semplicemente avvolgere tutto ciò che attraversa la linea di 80 caratteri:

Options: 
    --help      Show this message and exit 
    --version      Show version info and exit 
    -w WIDTH --width=WIDTH  The out to out width of the deck (feet) 
           [default: 73] 
    -g GIRDERS --girders=GIRDERS The number of girders [default: 8] 
    -h HEIGHT --height=HEIGHT  The height of the girders (inches) 
           [default: 56] 
    -t THICK --thick=THICK  The deck thickness (inches) [default: 8] 
    -a ADIM --adim=ADIM   The "A" dimension, max. deck thickness at 
           centerline of girder (inches) [default: 12] 
    -l LSLP --leftslope=LSLP  The left-hand deck slope (ft/ft) 
           [default: -0.02] 
    -r RSLP --rightslope=RSLP  The right-hand deck slope (ft/ft) 
           [default: -0.02] 
    -c --center     Indicates pivot point is at center of bridge 
    -o OFFSET --offset=OFFSET  The offset of pivot point from center 
           [default: 0] 

Non abbastanza leggibile, ma analizza in modo corretto.