Fabryka argparse.FileType
jest klasą fabryczną, która może otworzyć plik, i oczywiście w procesie wywołuje błąd, jeśli plik nie istnieje lub nie można go utworzyć. Możesz spojrzeć na jego kod, aby zobaczyć, jak stworzyć własną klasę (lub funkcję), aby przetestować swoje dane wejściowe.
Argument type
parametr jest wymagalne (funkcja, etc), która pobiera ciąg, testuje go, ile potrzeba, i konwertuje je (w razie potrzeby) do rodzaju wartości chcesz zapisać się do nazw args
. Więc może wykonać dowolne testy. Jeśli type
wywoła błąd, to analizator tworzy komunikat o błędzie (i użycie) i kończy działanie.
To, czy to odpowiednie miejsce do przeprowadzenia testu, zależy od Twojej sytuacji. Czasami otwieranie pliku z FileType
jest w porządku, ale musisz go zamknąć sam lub poczekać na zakończenie programu. Nie możesz użyć tego otwartego pliku w kontekście with open(filename) as f:
. To samo może dotyczyć twojej bazy danych. W złożonym programie możesz nie chcieć otwierać ani tworzyć pliku od razu.
Napisałem dla błędu/wydania Pythona odmianę FileType
, która utworzyła obiekt context
, obiekt, który może być użyty w kontekście with
. Użyłem także testów os
, aby sprawdzić, czy plik istnieje, czy może zostać utworzony, bez faktycznego wykonania. Wymagało to jednak dalszych sztuczek, jeśli file
byłby , którego nie chcesz zamykać. Czasami próby zrobienia tego w ten sposób w argparse
to po prostu więcej pracy niż jest warta.
W każdym razie, jeśli masz łatwą metodę testowania, można owinąć je w prosty type
funkcję tak:
def database(astring):
from os.path import exists
if not database_exists(astring):
raise ValueError # or TypeError, or `argparse.ArgumentTypeError
return astring
parser.add_argument('--database', dest='database',
type = database,
default=None, required=False, help='Database to restore')
Nie sądzę, jest to ważne dużo czy wdrożenie takiego badania w type
lub . Myślę, że type
jest prostszy i bardziej zgodny z intencjami programisty.
Świetna odpowiedź! Chciałbym polecić użycie argparse.ArgumentTypeError (message) w celu wydrukowania "message" na konsoli. – tabata