TL; DR
Gunakan nargs
opsi atau 'append'
pengaturan action
opsi (tergantung bagaimana Anda ingin antarmuka pengguna berperilaku).
nargs
parser.add_argument('-l','--list', nargs='+', help='<Required> Set flag', required=True)
# Use like:
# python arg.py -l 1234 2345 3456 4567
nargs='+'
membutuhkan 1 atau lebih argumen, nargs='*'
membutuhkan nol atau lebih.
menambahkan
parser.add_argument('-l','--list', action='append', help='<Required> Set flag', required=True)
# Use like:
# python arg.py -l 1234 -l 2345 -l 3456 -l 4567
Dengan append
Anda memberikan opsi beberapa kali untuk membangun daftar.
Jangan gunakan type=list
!!! - Mungkin tidak ada situasi di mana Anda akan ingin menggunakan type=list
dengan argparse
. Pernah.
Mari kita lihat lebih detail beberapa cara berbeda yang bisa dilakukan seseorang untuk melakukan ini, dan hasil akhirnya.
import argparse
parser = argparse.ArgumentParser()
# By default it will fail with multiple arguments.
parser.add_argument('--default')
# Telling the type to be a list will also fail for multiple arguments,
# but give incorrect results for a single argument.
parser.add_argument('--list-type', type=list)
# This will allow you to provide multiple arguments, but you will get
# a list of lists which is not desired.
parser.add_argument('--list-type-nargs', type=list, nargs='+')
# This is the correct way to handle accepting multiple arguments.
# '+' == 1 or more.
# '*' == 0 or more.
# '?' == 0 or 1.
# An int is an explicit number of arguments to accept.
parser.add_argument('--nargs', nargs='+')
# To make the input integers
parser.add_argument('--nargs-int-type', nargs='+', type=int)
# An alternate way to accept multiple inputs, but you must
# provide the flag once per input. Of course, you can use
# type=int here if you want.
parser.add_argument('--append-action', action='append')
# To show the results of the given option to screen.
for _, value in parser.parse_args()._get_kwargs():
if value is not None:
print(value)
Inilah output yang bisa Anda harapkan:
$ python arg.py --default 1234 2345 3456 4567
...
arg.py: error: unrecognized arguments: 2345 3456 4567
$ python arg.py --list-type 1234 2345 3456 4567
...
arg.py: error: unrecognized arguments: 2345 3456 4567
$ # Quotes won't help here...
$ python arg.py --list-type "1234 2345 3456 4567"
['1', '2', '3', '4', ' ', '2', '3', '4', '5', ' ', '3', '4', '5', '6', ' ', '4', '5', '6', '7']
$ python arg.py --list-type-nargs 1234 2345 3456 4567
[['1', '2', '3', '4'], ['2', '3', '4', '5'], ['3', '4', '5', '6'], ['4', '5', '6', '7']]
$ python arg.py --nargs 1234 2345 3456 4567
['1234', '2345', '3456', '4567']
$ python arg.py --nargs-int-type 1234 2345 3456 4567
[1234, 2345, 3456, 4567]
$ # Negative numbers are handled perfectly fine out of the box.
$ python arg.py --nargs-int-type -1234 2345 -3456 4567
[-1234, 2345, -3456, 4567]
$ python arg.py --append-action 1234 --append-action 2345 --append-action 3456 --append-action 4567
['1234', '2345', '3456', '4567']
Takeaways :
- Gunakan
nargs
atauaction='append'
nargs
bisa lebih mudah dari perspektif pengguna, tetapi bisa tidak intuitif jika ada argumen posisi karena argparse
tidak bisa mengatakan apa yang seharusnya menjadi argumen posisi dan apa yang menjadi milik nargs
; jika Anda memiliki argumen posisi maka action='append'
mungkin berakhir menjadi pilihan yang lebih baik.
- Di atas hanya berlaku jika
nargs
diberikan '*'
, '+'
atau '?'
. Jika Anda memberikan angka integer (seperti 4
) maka tidak akan ada masalah dengan opsi campuran nargs
dan argumen posisi karena argparse
akan tahu persis berapa banyak nilai yang diharapkan untuk opsi tersebut.
- Jangan gunakan kutipan di baris perintah 1
- Jangan gunakan
type=list
, karena akan mengembalikan daftar daftar
- Ini terjadi karena di bawah tenda
argparse
menggunakan nilai type
untuk memaksa setiap individu memberikan argumen yang Anda pilih type
, bukan agregat dari semua argumen.
- Anda dapat menggunakan
type=int
(atau apa pun) untuk mendapatkan daftar int (atau apa pun)
1 : Maksud saya tidak secara umum .. Maksud saya menggunakan tanda kutip untuk memberikan daftarargparse
bukan yang Anda inginkan.