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.

philippe
sumber

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
jfs
sumber
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')
Felix Kling
sumber
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