Łącznik w Pythonie Fire a podkreślenie
Pakiet python Firejest bardzo przydatny do uruchamiania skryptów Pythona z wiersza poleceń. Jedną z powszechnych rzeczy jest składanie argumentów z wielu słów, na przykład imię kota, które można zapisać na 3 sposoby:
- nameofcat
- name_of_cat
- imię-kota
Podczas gdy pierwsza jest kompatybilna prawie ze wszystkim, drugiej należy unikać w bashu ( czy opcje linii poleceń w systemach operacyjnych w stylu POSIX powinny być podkreślone? ), A trzecią w Pythonie ( Dlaczego python nie zezwala na używanie myślników w nazwy funkcji i zmiennych? ).
Problem polega na tym, że domyślnie fire pobierze nazwę argumentów z kodu Pythona, co oznacza, że jeśli mój kod w Pythonie wygląda tak:
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)
następnie aby wywołać go z linii poleceń (lub ze skryptu bash), należałoby zrobić
python script.py --name_of_cat Bob
W ten sposób używam go w tej chwili, ale wydaje mi się to nieoptymalne. Masz jakiś pomysł na to, jaka jest najlepsza praktyka?
PS: python script.py --name-of-cat Bobbyłoby niemożliwe, ponieważ Python nie może mieć łącznika w nazwach zmiennych.
Odpowiedzi
Wygląda na to, że działa z myślnikami lub podkreśleniami, prawdopodobnie z powodu tej linii kodu . Używając swojego skryptu:
> 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
To również zauważyć tutaj w docs ogień:
Aby utworzyć wystąpienie a,
Buildinga następnie uruchomićclimb_stairsfunkcję, wszystkie poniższe polecenia są prawidłowe:$ 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"Zauważysz, że łączniki i podkreślenia (
-i_) są wymienne w nazwach członków i nazwach flag.
Jednak wygenerowany tekst pomocy wydaje się prosić o flagę z podkreśleniami:
> 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
Moim zaleceniem jest to, że jeśli tworzysz szybki skrypt dla siebie, Fire jest niesamowity, ale jeśli tworzysz coś do dystrybucji lub bardziej złożonego, lepiej jest użyć bardziej konfigurowalnego frameworka, takiego jak argparse (zawarte w standardowym lib) lub kliknij (mój osobisty ulubiony). Oto lista korzyści, które sam stworzył Fire; jeśli twój przypadek użycia jest bardziej złożony, inna biblioteka może być lepsza.
Nie jestem pewien co do Firemodułu, ale mam aplikację wiersza poleceń w języku Python, w której używamy nameofcatskładni typu. Jako argument do skryptu przekazuję słowo z maksymalnie 17 aplhabets i nie używam łącznika ani podkreślenia.