Trattino di fuoco Python vs trattino basso
Il pacchetto python Fireè molto utile per avviare script python dalla riga di comando. Una cosa comune è avere argomenti composti da più parole, ad esempio il nome del gatto che può essere scritto in 3 modi comuni:
- nameofcat
- nome_di_cat
- nome-di-gatto
Mentre il primo è compatibile praticamente con tutto, il secondo dovrebbe essere evitato in bash (le opzioni della riga di comando nei sistemi operativi in stile POSIX dovrebbero essere in stile underscore? ) E la terza in python ( perché python non consente l'uso di trattini nomi di funzioni e variabili? ).
Il problema qui è che per impostazione predefinita il fuoco prenderà il nome degli argomenti dal codice python, il che significa che se il mio codice python ha questo aspetto:
script.py:
import fire
def main(name_of_cat='Steve'):
print(f'The name of the cast is {name_of_cat}')
if __name__ == '__main__':
fire.Fire(main)
quindi per chiamarlo dalla riga di comando (o da uno script bash), si farebbe
python script.py --name_of_cat Bob
Questo è il modo in cui lo sto usando al momento, ma non sembra ottimale. Qualche idea su quale sia la migliore pratica qui?
PS: python script.py --name-of-cat Bobsarebbe impossibile dato che python non può avere trattino nei nomi delle variabili.
Risposte
Sembra che funzioni con trattini o trattini bassi, probabilmente a causa di questa riga di codice . Usando il tuo script:
> python .\script.py --name_of_cat Bob
The name of the cast is Bob
> python .\script.py --name-of-cat Bob
The name of the cast is Bob
Questo è anche notato qui nei documenti di Fire:
Per creare un'istanza
Buildinge quindi eseguire laclimb_stairsfunzione, i seguenti comandi sono tutti validi:$ python example.py --name="Sherrerd Hall" --stories=3 climb_stairs 10 $ python example.py --name="Sherrerd Hall" climb_stairs --stairs_per_story=10 $ python example.py --name="Sherrerd Hall" climb_stairs --stairs-per-story 10 $ python example.py climb-stairs --stairs-per-story 10 --name="Sherrerd Hall"Noterai che trattini e trattini bassi (
-e_) sono intercambiabili nei nomi dei membri e nei nomi dei flag.
Tuttavia, il testo della guida generato sembra richiedere una bandiera con trattini bassi:
> python .\script.py -h
INFO: Showing help with the command 'script.py -- --help'.
NAME
script.py
SYNOPSIS
script.py <flags>
FLAGS
--name_of_cat=NAME_OF_CAT
La mia raccomandazione è che se stai creando uno script veloce per te stesso, Fire è fantastico, ma se stai creando qualcosa da distribuire o più complesso, è meglio usare un framework più configurabile, come argparse (incluso in stdlib) o fare clic su (il mio preferito personale). Ecco l'elenco autoaffermato dei vantaggi di Fire; se il tuo caso d'uso è più complesso, un'altra libreria potrebbe essere migliore.
Non sono sicuro del Firemodulo, ma ho un'applicazione a riga di comando python in cui stiamo usando la nameofcatsintassi del tipo. Passo una parola con fino a 17 aplhabets in totale come argomento per la sceneggiatura e non uso alcun trattino o trattino basso.