Używam następującego prostego kodu, aby przeanalizować niektóre argumenty; zwróć uwagę, że jeden z nich jest wymagany. Niestety, gdy użytkownik uruchamia skrypt bez podania argumentu, wyświetlany tekst użycia / pomocy nie wskazuje, że istnieje opcjonalny argument, co uważam za bardzo mylące. Jak mogę uzyskać od Pythona wskazania, że argument nie jest opcjonalny?
Oto kod:
import argparse
if __name__ == '__main__':
parser = argparse.ArgumentParser(
description='Foo')
parser.add_argument('-i','--input', help='Input file name', required=True)
parser.add_argument('-o','--output', help='Output file name', default="stdout")
args = parser.parse_args()
print ("Input file: %s" % args.input )
print ("Output file: %s" % args.output )
Podczas uruchamiania powyżej kodu bez podania wymaganego argumentu otrzymuję następujące dane wyjściowe:
usage: foo.py [-h] -i INPUT [-o OUTPUT]
Foo
optional arguments:
-h, --help show this help message and exit
-i INPUT, --input INPUT
Input file name
-o OUTPUT, --output OUTPUT
Output file name
-i INPUT
część nie jest otoczona nawiasami kwadratowymi, co subtelność wskazuje, że jest to rzeczywiście wymagane. Możesz także ręcznie wyjaśnić to przezhelp
paramoptional arguments
dla wymaganych argumentów nadal wprowadza w błąd.Odpowiedzi:
Parametry rozpoczynające się od
-
lub--
są zwykle uważane za opcjonalne. Wszystkie pozostałe parametry są parametrami pozycyjnymi i jako takie są wymagane przez projekt (podobnie jak argumenty funkcji pozycyjnych). Można wymagać opcjonalnych argumentów, ale jest to nieco sprzeczne z ich projektem. Ponieważ nadal są częścią argumentów niepozycjonujących, nadal będą wymienione w mylącym nagłówku „argumenty opcjonalne”, nawet jeśli są wymagane. Brakujące nawiasy kwadratowe w części dotyczącej użytkowania wskazują jednak, że rzeczywiście są one wymagane.Zobacz także dokumentację :
To powiedziawszy, nagłówki „argumenty pozycyjne” i „argumenty opcjonalne” w pomocy są generowane przez dwie grupy argumentów, na które argumenty są automatycznie dzielone. Teraz możesz „włamać się” i zmienić nazwę opcjonalnych, ale o wiele bardziej eleganckim rozwiązaniem byłoby utworzenie innej grupy dla „wymaganych nazwanych argumentów” (lub jakkolwiek chcesz je nazwać):
źródło
parser.parse_args([])
Zamiast tego używajparser.parse_args()
bez argumentów, aby przechwycić zawartość sys.argv. Per argparsePonieważ wolę podać wymagane argumenty przed opcjonalnym, włamuję się do nich za pomocą:
i to daje:
Mogę żyć bez pomocy w grupie argumentów opcjonalnych.
źródło
Kompilacja @Karl Rosaen
i to daje:
źródło
_action_group
bez dostępu do chronionego członka? W moim przypadku muszę dodać argument do już istniejącej (niestandardowej) grupy.Jeszcze raz, budując @RalphyZ
Ten nie psuje ujawnionego API.
Który pokaże to samo co powyżej i powinien przetrwać przyszłe wersje:
źródło
_action_groups
jest przeznaczony wyłącznie do użytku wewnętrznego. Dlatego nie ma gwarancji zgodności między wersjami.