penyimpanan argparse false jika tidak ditentukan

104
parser.add_argument('-auto', action='store_true')

Bagaimana cara menyimpan false jika -autotidak ditentukan? Sedikit dapat saya ingat bahwa dengan cara ini, ia menyimpan None jika tidak ditentukan

siamii
sumber

Jawaban:

171

The store_truepilihan secara otomatis membuat nilai default dari False .

Demikian juga, store_falseakan default ke True saat argumen baris perintah tidak ada.

Sumber untuk perilaku ini singkat dan jelas: http://hg.python.org/cpython/file/2.7/Lib/argparse.py#l861

Dokumen argparse tidak jelas tentang subjeknya, jadi saya akan memperbaruinya sekarang: http://hg.python.org/cpython/rev/49677cc6d83a

Raymond Hettinger
sumber
2
Beberapa komentar tentang ini. Pertama, tampaknya jika opsinya adalah -bar, maka destsecara otomatis disetel ke bar, berdasarkan hg.python.org/cpython/rev/49677cc6d83a . Namun, saya tidak melihat di mana perilaku default ini disetel dalam kode. Saya selalu mengatur destargumen secara eksplisit. Juga, saya pikir membiarkan bardefault ke destuntuk --baropsi tidak benar-benar masuk akal jika --barini store_false. Bukankah destseharusnya notbardalam kasus ini?
Faheem Mitha
4
Saya tidak memahami konvensi penamaan pelawan.
brainLoop
Saya setuju, ini agak membingungkan. Bagaimanapun, 'store_false' atau 'store_true' ditetapkan sebagai tindakan dan bukan nilai default. Jadi, saat Anda menambahkan argumen ini ke program, tindakan yang ditentukan dipicu.
ady
15

Dengan

import argparse
parser=argparse.ArgumentParser()
parser.add_argument('-auto', action='store_true', )
args=parser.parse_args()
print(args)

berlari

% test.py

hasil

Namespace(auto=False)

Jadi tampaknya menyimpan Falsesecara default.

unutbu
sumber
3

Raymond Hettinger sudah menjawab pertanyaan OP.

Namun, grup saya mengalami masalah keterbacaan menggunakan "store_false". Apalagi saat anggota baru bergabung dengan grup kami. Ini karena cara berpikir yang paling intuitif adalah ketika pengguna menentukan argumen, nilai yang sesuai dengan argumen itu akan menjadi True atau 1.

Misalnya, jika kodenya adalah -

parser.add_argument('--stop_logging', action='store_false')

Pembaca kode mungkin mengharapkan pernyataan logging dimatikan ketika nilai dalam stop_logging benar. Tetapi kode seperti berikut ini akan mengarah pada kebalikan dari perilaku yang diinginkan -

if not stop_logging:
    #log

Di sisi lain, jika antarmuka didefinisikan sebagai berikut, maka "pernyataan-jika" berfungsi dan lebih intuitif untuk dibaca -

parser.add_argument('--stop_logging', action='store_true')
if not stop_logging:
    #log
MonsieurBeilto
sumber
7
Anda dapat mengatur alias tujuan, yang akan lebih mudah dibaca: parser.add_argument('--stop_logging', action='store_false', dest='use_logging').
Krassi
-4

store_false sebenarnya akan menjadi default 0secara default (Anda dapat menguji untuk memverifikasi). Untuk mengubah defaultnya, tambahkan saja default=Trueke deklarasi Anda.

Jadi dalam kasus ini: parser.add_argument('-auto', action='store_true', default=True)

Unix-Ninja
sumber
Ini tampaknya tidak terjadi pada Python 2.7 dan 3.4: >>> parser.add_argument('--bar', action='store_false') _StoreFalseAction(option_strings=['--bar'], dest='bar', nargs=0, const=False, default=True, type=None, choices=None, help=None, metavar=None) >>> parser.parse_args([]) Namespace(bar=True)
Leynos
2
maaf, itu sebenarnya perilaku default dari optparse. argparse harus default ke kebalikan dari penyimpanan. yaitu, 'store_false' defaultnya adalah 'True'.
Unix-Ninja