Chciałbym dokonać tych wywołań pracy myprog, a nie innych.jak uczynić argument opcjonalnym w python argparse
$ python3 myprog.py -i infile -o outfile
$ python3 myprog.py -o outfile
$ python3 myprog.py -o
$ python3 myprog.py
W szczególności chcę, aby to nielegalne określić plik_we ale nie plik_wy.
W trzecim przypadku przyjmuje się domyślną nazwę pliku wyjściowego "out.json". W drugim, trzecim i czwartym przypadku przyjmuje się domyślną nazwę pliku wejściowego "file.n.json", gdzie n jest liczbą całkowitą wersji. W czwartym przypadku plikiem wyjściowym będzie "file.n + 1.json", gdzie n + 1 jest wersją numer jeden większą niż ta na pliku wejściowym. Odpowiedni fragment mojego kodu jest:
import argparse
parser = argparse.ArgumentParser(description="first python version")
parser.add_argument('-i', '--infile', nargs=1, type=argparse.FileType('r'), help='input file, in JSON format')
parser.add_argument('-o', '--outfile', nargs='?', type=argparse.FileType('w'), default='out.json', help='output file, in JSON format')
args = parser.parse_args()
print("Here's what we saw on the command line: ")
print("args.infile",args.infile)
print("args.outfile",args.outfile)
if args.infile and not args.outfile:
parser.error("dont specify an infile without specifying an outfile")
elif not args.infile:
print("fetching infile")
else: # neither was specified on the command line
print("fetching both infile and outfile")
Problem jest, gdy biegnę
$ python3 myprog.py -i infile.json
zamiast błędu parsera się spodziewałem, otrzymuję:
Here's what we saw on the command line:
args.infile [<_io.TextIOWrapper name='infile.json' mode='r' encoding='UTF-8'>]
args.outfile <_io.TextIOWrapper name='out.json' mode='w' encoding='UTF-8'>
fetching both infile and outfile
... co sugeruje, że nawet jeśli nie było "-o" na linii poleceń, działało to tak, jakby było.
Jaka jest różnica między trzecim a czwartym przypadkiem? co oznacza "-o"? –
Czwarty przypadek będzie używał domyślnych nazw plików typu "plik-plik" i "plik wyjściowy" (szczególnie file.n.json i file.n + 1.json, tzn. Pliki z osadzonymi numerami wersji). Różnią się one od "out.json", co spowodowałoby trzeci przypadek z opcją "-o". Zmodyfikowałem powyższy tekst, aby to zaznaczyć. – user1416227
Jak działa czwarty przypadek, ponieważ opcja '--input' nie ma wartości domyślnej? – maxschlepzig