Jawaban:
The store_true
pilihan secara otomatis membuat nilai default dari False .
Demikian juga, store_false
akan 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 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
parser.add_argument('--stop_logging', action='store_false', dest='use_logging')
.
store_false sebenarnya akan menjadi default 0
secara default (Anda dapat menguji untuk memverifikasi). Untuk mengubah defaultnya, tambahkan saja default=True
ke deklarasi Anda.
Jadi dalam kasus ini:
parser.add_argument('-auto', action='store_true', default=True)
>>> 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)
-bar
, makadest
secara otomatis disetel kebar
, berdasarkan hg.python.org/cpython/rev/49677cc6d83a . Namun, saya tidak melihat di mana perilaku default ini disetel dalam kode. Saya selalu mengaturdest
argumen secara eksplisit. Juga, saya pikir membiarkanbar
default kedest
untuk--bar
opsi tidak benar-benar masuk akal jika--bar
inistore_false
. Bukankahdest
seharusnyanotbar
dalam kasus ini?