Trattino di fuoco Python vs trattino basso

Oct 16 2020

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

2 JonathanDayton Oct 24 2020 at 04:07

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 la climb_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.

Simplecode Oct 19 2020 at 20:25

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.