Python Fire-Bindestrich gegen Unterstrich

Oct 16 2020

Das Python-Paket Fireist sehr nützlich, um Python-Skripte über die Befehlszeile zu starten. Eine übliche Sache ist, Argumente aus mehreren Wörtern zu haben, zum Beispiel den Namen der Katze, die auf drei Arten geschrieben werden können:

  • nameofcat
  • name_of_cat
  • Name der Katze

Während der erste mit so ziemlich allem kompatibel ist, sollte der zweite in bash ( sollten Befehlszeilenoptionen in POSIX-ähnlichen Betriebssystemen unterstrichen werden? ) Und der dritte in Python ( Warum verbietet Python die Verwendung von Bindestrichen innerhalb von Python) vermieden werden Funktions- und Variablennamen? ).

Das Problem hierbei ist, dass fire standardmäßig den Argumentnamen aus dem Python-Code übernimmt. Dies bedeutet, dass mein Python-Code folgendermaßen aussieht:

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)

Um es dann über die Befehlszeile (oder über ein Bash-Skript) aufzurufen, würde man es tun

python script.py --name_of_cat Bob

So benutze ich es momentan, aber das fühlt sich suboptimal an. Irgendeine Idee, was die beste Praxis hier ist?

PS: python script.py --name-of-cat Bobwäre unmöglich, da Python keinen Bindestrich in Variablennamen haben kann.

Antworten

2 JonathanDayton Oct 24 2020 at 04:07

Es sieht so aus, als würde es entweder mit Bindestrichen oder Unterstrichen funktionieren, möglicherweise aufgrund dieser Codezeile . Verwenden Sie Ihr Skript:

> 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

Dies wird auch hier in den Fire-Dokumenten vermerkt :

Um a zu instanziieren Buildingund dann die climb_stairsFunktion auszuführen, sind alle folgenden Befehle gültig:

$ 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"

Sie werden feststellen, dass Bindestriche und Unterstriche ( -und _) in Mitgliedsnamen und Flaggennamen austauschbar sind.

Der generierte Hilfetext scheint jedoch nach einem Flag mit Unterstrichen zu fragen:

> 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

Meine Empfehlung ist, dass Fire fantastisch ist, wenn Sie ein schnelles Skript für sich selbst erstellen. Wenn Sie jedoch etwas erstellen, das verteilt oder komplexer ist, ist es besser, ein konfigurierbareres Framework wie argparse (in stdlib enthalten) oder zu verwenden Klicken Sie auf (mein persönlicher Favorit). Hier ist die von Fire selbst angegebene Liste der Vorteile. Wenn Ihr Anwendungsfall komplexer ist, ist möglicherweise eine andere Bibliothek besser.

Simplecode Oct 19 2020 at 20:25

FireIch bin mir über das Modul nicht sicher, aber ich habe eine Python-Befehlszeilenanwendung, in der wir die nameofcatTypensyntax verwenden. Ich übergebe ein Wort mit insgesamt bis zu 17 Aplhabets als Argument für das Skript und verwende keinen Hypen oder Unterstrich.