modul argparse Bagaimana cara menambahkan opsi tanpa argumen?


165

Saya telah membuat skrip menggunakan argparse.

Skrip perlu mengambil nama file konfigurasi sebagai opsi, dan pengguna dapat menentukan apakah mereka harus melanjutkan sepenuhnya skrip atau hanya mensimulasikannya.

Args yang harus dilewati: ./script -f config_file -satau ./script -f config_file.

Tidak apa-apa untuk bagian -f config_file, tetapi ia terus meminta saya untuk argumen -s yang merupakan opsional dan tidak boleh diikuti oleh apa pun.

Saya sudah mencoba ini:

parser = argparse.ArgumentParser()
parser.add_argument('-f', '--file')
#parser.add_argument('-s', '--simulate', nargs = '0')
args = parser.parse_args()
if args.file:
    config_file = args.file
if args.set_in_prod:
        simulate = True
else:
    pass

Dengan kesalahan berikut:

File "/usr/local/lib/python2.6/dist-packages/argparse.py", line 2169, in _get_nargs_pattern
nargs_pattern = '(-*%s-*)' % '-*'.join('A' * nargs)
TypeError: can't multiply sequence by non-int of type 'str'

Dan kesalahan yang sama dengan ''bukannya 0.

Jawaban:


233

Sebagai @Felix Kling disarankan digunakan action='store_true':

>>> from argparse import ArgumentParser
>>> p = ArgumentParser()
>>> _ = p.add_argument('-f', '--foo', action='store_true')
>>> args = p.parse_args()
>>> args.foo
False
>>> args = p.parse_args(['-f'])
>>> args.foo
True

97

Untuk membuat opsi yang tidak membutuhkan nilai, atur action [docs] untuk 'store_const', 'store_true'atau 'store_false'.

Contoh:

parser.add_argument('-s', '--simulate', action='store_true')

Halo; Terima kasih atas jawaban Anda. Saya telah mencoba seperti yang dijelaskan dalam dokumen: >>> parser.add_argument ('- foo', '-f', action = 'store_true') _StoreTrueAction (option_strings = ['- foo', '-f'], dest = 'foo', nargs = 0, const = Benar, default = Salah, tipe = Tidak ada, pilihan = Tidak ada, bantuan = Tidak ada, metavar = Tidak Ada >>> parser.parse_args () Namespace (foo = False) >> > print args.foo Traceback (panggilan terakhir terakhir): File "<stdin>", baris 1, dalam <module> AttributeError: objek 'Namespace' tidak memiliki atribut 'foo' >>> `Ini sepertinya tidak berfungsi; Saya tidak tahu cara mengambil nilai setelah penugasan. Terima kasih telah membantuku!
philippe

@ philippe: Anda lupa mengikat parser.parse_args()nilai yang dikembalikan ke args stackoverflow.com/questions/5262702/…
jfs

@ philippe: args = parser.parse_args()seperti yang sudah Anda miliki dalam kode Anda. Anda hanya perlu mengganti baris komentar dan kemudian Anda dapat mengakses nilainya args.simulate.
Felix Kling
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.