Mój skrypt python musi odczytać pliki z katalogu przekazanego w linii poleceń. Zdefiniowałem typ readable_dir, jak poniżej, do użycia z argparse do sprawdzania, czy katalog przekazany w linii poleceń jest dostępny i czytelny. Dodatkowo, dla argumentu katalogu podano domyślną wartość (/ tmp/non_existent_dir w poniższym przykładzie). Problem polega na tym, że argparse wywołuje readable_dir() na wartości domyślnej nawet w sytuacji, gdy argument katalogu jest jawnie przekazywany w linii poleceń. To powoduje, że skrypt się psuje, ponieważ domyślna ścieżka/tmp/non_existent_dir nie istnieje w kontekście, w którym katalog jest jawnie przekazywany w linii poleceń. Mogę obejść ten problem, nie określając wartości domyślnej i czyniąc ten argument obowiązkowym, lub odraczając walidację na później w skrypcie, ale jest to bardziej eleganckie rozwiązanie, o którym ktoś jest świadomy?typy ścieżek katalogów z argparse
#!/usr/bin/python
import argparse
import os
def readable_dir(prospective_dir):
if not os.path.isdir(prospective_dir):
raise Exception("readable_dir:{0} is not a valid path".format(prospective_dir))
if os.access(prospective_dir, os.R_OK):
return prospective_dir
else:
raise Exception("readable_dir:{0} is not a readable dir".format(prospective_dir))
parser = argparse.ArgumentParser(description='test', fromfile_prefix_chars="@")
parser.add_argument('-l', '--launch_directory', type=readable_dir, default='/tmp/non_existent_dir')
args = parser.parse_args()
Przydatny przykład kodu. Raise powinno "podnieść argparse.ArgumentTypeError", ale w przeciwnym razie, wykopuję typ readable_dir. – mlissner