TL; DR
Sử dụng nargs
tùy chọn hoặc 'append'
cài đặt của action
tùy chọn (tùy thuộc vào cách bạn muốn giao diện người dùng hoạt động).
xà cừ
parser.add_argument('-l','--list', nargs='+', help='<Required> Set flag', required=True)
# Use like:
# python arg.py -l 1234 2345 3456 4567
nargs='+'
mất 1 hoặc nhiều đối số, nargs='*'
mất 0 hoặc nhiều hơn.
chắp thêm
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
Với append
bạn cung cấp tùy chọn nhiều lần để xây dựng danh sách.
Đừng dùng type=list
!!! - Có lẽ không có tình huống mà bạn muốn sử dụng type=list
với argparse
. Không bao giờ.
Chúng ta hãy xem chi tiết hơn về một số cách khác nhau mà người ta có thể cố gắng để làm điều này, và kết quả cuối cùng.
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)
Đây là đầu ra bạn có thể mong đợi:
$ 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']
Hành trình :
- Sử dụng
nargs
hoặcaction='append'
nargs
có thể đơn giản hơn từ góc độ người dùng, nhưng có thể không trực quan nếu có các đối số vị trí vì argparse
không thể cho biết đâu là đối số vị trí và thuộc về cái gì nargs
; nếu bạn có lập luận theo vị trí thì action='append'
cuối cùng có thể là một lựa chọn tốt hơn.
- Trên đây chỉ là đúng nếu
nargs
được đưa ra '*'
, '+'
hoặc '?'
. Nếu bạn cung cấp một số nguyên (chẳng hạn như 4
) thì sẽ không có vấn đề trộn các tùy chọn với nargs
và đối số vị trí bởi vì argparse
sẽ biết chính xác có bao nhiêu giá trị mong đợi cho tùy chọn.
- Không sử dụng dấu ngoặc kép trên dòng lệnh 1
- Không sử dụng
type=list
, vì nó sẽ trả về một danh sách các danh sách
- Điều này xảy ra bởi vì bên dưới mui xe
argparse
sử dụng giá trị type
để ép buộc từng đối số đã cho mà bạn chọn type
, không phải tổng hợp của tất cả các đối số.
- Bạn có thể sử dụng
type=int
(hoặc bất cứ điều gì) để có được danh sách ints (hoặc bất cứ điều gì)
1 : Tôi không có ý nói chung .. Tôi có nghĩa là sử dụng dấu ngoặc kép để vượt qua một danh sáchargparse
không phải là điều bạn muốn.