Trait d'union Python Fire vs trait de soulignement
Le package python Fireest très utile pour lancer des scripts python à partir de la ligne de commande. Une chose commune est d'avoir des arguments composés de plusieurs mots, par exemple le nom du chat qui peut être écrit de 3 manières communes:
- nomde chat
- nom_du_cat
- nom-de-chat
Alors que le premier est compatible avec à peu près tout, le second doit être évité dans bash (les options de ligne de commande dans les systèmes d'exploitation de style POSIX doivent-elles être de style souligné? ) Et le troisième en python ( pourquoi python interdit noms de fonction et de variable? ).
Le problème ici est que par défaut, le feu prendra le nom des arguments du code python, ce qui signifie que si mon code python ressemble à ceci:
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)
puis pour l'appeler depuis la ligne de commande (ou depuis un script bash), on ferait
python script.py --name_of_cat Bob
C'est la façon dont je l'utilise pour le moment, mais cela me semble sous-optimal. Une idée de ce que la meilleure pratique est ici?
PS: ce python script.py --name-of-cat Bobserait impossible car python ne peut pas avoir de trait d'union dans les noms de variables.
Réponses
Il semble que cela fonctionne avec des tirets ou des traits de soulignement, probablement à cause de cette ligne de code . Utilisation de votre 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
Ceci est également noté ici dans la documentation Fire:
Pour instancier a
Buildingpuis exécuter laclimb_stairsfonction, les commandes suivantes sont toutes valides:$ 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"Vous remarquerez que les tirets et les traits de soulignement (
-et_) sont interchangeables dans les noms de membres et les noms de drapeau.
Cependant, le texte d'aide généré semble demander un drapeau avec des traits de soulignement:
> 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
Ma recommandation est que si vous créez un script rapide pour vous-même, Fire est génial, mais si vous faites quelque chose à distribuer ou plus complexe, il est préférable d'utiliser un cadre plus configurable, comme argparse (inclus dans stdlib) ou cliquez sur (mon favori personnel). Voici la liste autodéclarée des avantages de Fire; si votre cas d'utilisation est plus complexe, une autre bibliothèque pourrait être meilleure.
Je ne suis pas sûr du Firemodule mais j'ai une application de ligne de commande python où nous utilisons la nameofcatsyntaxe de type. Je passe un mot avec jusqu'à 17 aplhabets au total en tant qu'argument au script et je n'utilise pas d'hypen ou de soulignement.