Saya ingin memeriksa apakah argumen argparse opsional telah ditetapkan oleh pengguna atau tidak.
Bisakah saya memeriksa dengan aman menggunakan isset?
Sesuatu seperti ini:
if(isset(args.myArg)):
#do something
else:
#do something else
Apakah ini bekerja sama untuk argumen tipe float / int / string?
Saya bisa menyetel parameter default dan memeriksanya (misalnya, set myArg = -1, atau "" untuk string, atau "NOT_SET"). Namun, nilai yang akhirnya ingin saya gunakan hanya dihitung nanti dalam skrip. Jadi saya akan mengaturnya ke -1 sebagai default, dan kemudian memperbaruinya ke sesuatu yang lain nanti. Ini tampaknya sedikit kikuk dibandingkan dengan hanya memeriksa apakah nilainya ditetapkan oleh pengguna.
isset()
(petunjuk: Python bukan PHP)? Apakah yang Anda maksudhasattr()
sebaliknya, mungkin? Mengapa tidak mengonfigurasi argparse untuk menyetel default untuk suatu opsi?Jawaban:
Saya pikir argumen opsional (ditentukan dengan
--
) diinisialisasiNone
jika tidak diberikan. Jadi Anda bisa mengujinya denganis not None
. Coba contoh di bawah ini:sumber
default
menentukan nilainya.default
, Anda masih dapat menyetelnargs='?'
dan memberikanconst
nilai, seperti yang dijelaskan di dokumen . Ketika arg tidak ada,default
digunakan, ketika arg diberikan nilai w / o, makaconst
digunakan, jika tidak nilai yang diberikan digunakan. Dengan onlydefault
andnargs='?'
,default
digunakan jika tidak diberikan,None
jika diberikan nilai w / o, sebaliknya nilai yang diberikan.action= "store_true"
atauaction="store_const", const="yourconst"
Anda tidak dapat menggunakan argumen itu untuk menyimpan nilai lain. Ini tidak akan berfungsi saat menggunakan default. Secara pribadi, saya telah menghapus semua default dari argparser dan menangani semua di dalam fungsi lain didef defaults():
mana saya mencampur ConfigParser, ArgumentParser dan nilai default dalam urutan yang saya inginkanaction
. Jawabannya tidak menggunakanaction
. Tindakan yang Anda sebutkan didokumentasikan untuk berperilaku dalam satu cara tertentu (seperti yang Anda amati). Tindakan tidak perlu didefinisikan.Karena catatan @Honza
is None
adalah ujian yang bagus. Ini defaultdefault
, dan pengguna tidak dapat memberi Anda string yang menduplikasinya.Anda dapat menentukan yang lain
default='mydefaultvalue
, dan mengujinya. Tetapi bagaimana jika pengguna menentukan string itu? Apakah itu dihitung sebagai pengaturan atau tidak?Anda juga bisa menentukan
default=argparse.SUPPRESS
. Kemudian jika pengguna tidak menggunakan argumen, itu tidak akan muncul diargs
namespace. Tetapi pengujian itu mungkin lebih rumit:Secara internal
parser
menyimpan daftarseen_actions
, dan menggunakannya untuk pengujian 'diperlukan' dan 'mutually_exclusive'. Tapi itu tidak tersedia untuk Anda di luarparse_args
.sumber
Saya pikir menggunakan opsi
default=argparse.SUPPRESS
paling masuk akal. Kemudian, alih-alih memeriksa apakah argumennyanot None
, memeriksa apakah argumen adalahin
namespace yang dihasilkan.Contoh:
Pemakaian:
Argumen tidak diberikan:sumber
testfoo.py: error: argument --foo: expected one argument
--foo
tanpa nilai (misalnya1
dalam contoh saya), Anda harus menentukannargs=0
dalamadd_argument
fungsinya.action='store_true'
jawaban di bawah ini sebagai gantinya dalam kode saya yang sebenarnya.python argparse_test.py --foo 1
?Anda dapat memeriksa flag yang diteruskan secara opsional dengan
store_true
danstore_false
opsi tindakan argumen:Dengan cara ini, Anda tidak perlu khawatir tentang memeriksa dengan bersyarat
is not None
. Anda cukup memeriksaTrue
atauFalse
. Baca lebih lanjut tentang opsi ini dalam dokumen di sinisumber
Jika argumen Anda posisional (misalnya tidak memiliki awalan "-" atau "-", hanya argumennya, biasanya nama file) maka Anda dapat menggunakan parameter nargs untuk melakukan ini:
sumber
Berikut adalah solusi saya untuk melihat apakah saya menggunakan variabel argparse
Ini mungkin memberi lebih banyak wawasan untuk jawaban di atas yang saya gunakan dan sesuaikan untuk bekerja untuk program saya.
sumber
Untuk menanggapi komentar @ kcpr atas jawaban (yang diterima saat ini) oleh @Honza Osobne
pertama-tama kita dapat memeriksa apakah argumen disediakan dengan membandingkannya dengan
Namespace
objek abd yang menyediakandefault=argparse.SUPPRESS
opsi (lihat jawaban @ hpaulj dan @Erasmus Cedernaes dan dokumen python3 ini ) dan jika belum disediakan, setel ke nilai default.Pemakaian
sumber
Sangat sederhana, setelah mendefinisikan variabel args dengan 'args = parser.parse_args ()' itu berisi semua data variabel subset args juga. Untuk memeriksa apakah sebuah variabel disetel atau tidak dengan asumsi 'action = "store_true" digunakan ...
sumber