Chciałbym sprawdzić, czy użytkownik ustawił opcjonalny argument argparse, czy nie.
Czy mogę bezpiecznie sprawdzić za pomocą isset?
Coś takiego:
if(isset(args.myArg)):
#do something
else:
#do something else
Czy to działa tak samo dla argumentów typu float / int / string?
Mógłbym ustawić domyślny parametr i sprawdzić go (np. Ustawić myArg = -1 lub „” dla ciągu znaków lub „NOT_SET”). Jednak wartość, której ostatecznie chcę użyć, jest obliczana dopiero później w skrypcie. Więc ustawiłbym go domyślnie na -1, a później zaktualizowałbym go na coś innego. Wydaje się to trochę niezgrabne w porównaniu ze zwykłym sprawdzaniem, czy wartość została ustawiona przez użytkownika.
isset()
było (wskazówka: Python to nie PHP)? Czyhasattr()
zamiast tego miałeś na myśli , może? Dlaczego nie skonfigurować argparse, aby zamiast tego ustawić wartość domyślną dla opcji?Odpowiedzi:
Myślę, że argumenty opcjonalne (określone za pomocą
--
) są inicjowane,None
jeśli nie zostały podane. Możesz więc przetestowaćis not None
. Wypróbuj poniższy przykład:źródło
default
zdefiniowaną wartość.default
, nadal możesz ustawićnargs='?'
i podaćconst
wartość, zgodnie z opisem w dokumentacji . Gdy arg jest nieobecny,default
jest używany, gdy argument podano bez wartości, toconst
jest używany, w przeciwnym razie używana jest podana wartość. Tylko zdefault
inargs='?'
,default
jest używane, jeśli nie jest podane,None
jeśli podano bez wartości, w przeciwnym razie podana wartość.action= "store_true"
lubaction="store_const", const="yourconst"
nie możesz użyć tego argumentu do przechowywania innej wartości. To nie zadziała, jeśli używasz ustawień domyślnych. W moim własnym usunąłem wszystkie wartości domyślne z argparser i obsłużyłem wszystko wewnątrz innej funkcji, wdef defaults():
której mieszam ConfigParser, ArgumentParser i domyślne wartości w kolejności, w jakiej chcęaction
. Odpowiedź nie używa rozszerzeniaaction
. Działania, o których wspomniałeś, są udokumentowane jako zachowujące się w jeden określony sposób (jak zaobserwowałeś). Nie jest jednak konieczne definiowanie akcji.Jak zauważa @Honza,
is None
to dobry test. Jest to wartość domyślnadefault
, a użytkownik nie może przekazać ciągu, który go powiela.Możesz określić inny
default='mydefaultvalue
i przetestować go. Ale co, jeśli użytkownik określi ten ciąg? Czy to liczy się jako ustawienie, czy nie?Możesz również określić
default=argparse.SUPPRESS
. Jeśli użytkownik nie użyje argumentu, nie pojawi się on wargs
przestrzeni nazw. Ale testowanie, które może być bardziej skomplikowane:Wewnętrznie
parser
przechowuje listęseen_actions
i używa jej do testów „wymaganych” i „wzajemnie wykluczających się”. Ale to nie jest dostępne dla ciebie pozaparse_args
.źródło
Myślę, że użycie tej opcji
default=argparse.SUPPRESS
ma największy sens. Następnie zamiast sprawdzać, czy argumentem jestnot None
, sprawdza się, czy argumentem jestin
wynikowa przestrzeń nazw.Przykład:
Stosowanie:
Nie podano argumentu:źródło
testfoo.py: error: argument --foo: expected one argument
--foo
bez wartości (czyli1
w moim przykładzie), musisz określićnargs=0
wadd_argument
funkcji.action='store_true'
odpowiedzi poniżej w moim rzeczywistym kodzie.python argparse_test.py --foo 1
?Możesz sprawdzić opcjonalnie przekazaną flagę z opcjami akcji
store_true
istore_false
argumentami:W ten sposób nie musisz się martwić sprawdzaniem warunkowym
is not None
. Po prostu sprawdzaszTrue
lubFalse
. Przeczytaj więcej o tych opcjach w dokumentacji tutajźródło
Jeśli Twój argument jest pozycyjny (tj. Nie ma przedrostka „-” ani „-”, tylko argument, zazwyczaj nazwa pliku), możesz użyć parametru nargs, aby to zrobić:
źródło
Oto moje rozwiązanie, aby sprawdzić, czy używam zmiennej argparse
Może to dać lepszy wgląd w powyższą odpowiedź, której użyłem i dostosowałem do pracy w moim programie.
źródło
Aby odpowiedzieć na komentarz @ kcpr do (obecnie zaakceptowanej) odpowiedzi @Honza Osobne
można najpierw sprawdzić, czy argument został podany, porównując go z
Namespace
obiektem i podającdefault=argparse.SUPPRESS
opcję (patrz odpowiedzi @ hpaulj i @Erasmus Cedernaes oraz ten dokument python3 ), a jeśli nie został podany, ustaw go na wartość domyślną.Stosowanie
źródło
Bardzo proste, po zdefiniowaniu zmiennej args przez 'args = parser.parse_args ()' zawiera ona również wszystkie dane zmiennych podzbioru args. Aby sprawdzić, czy zmienna jest ustawiona, czy nie, zakładając, że użyto 'action = "store_true" ...
źródło