TL; DR
ใช้nargs
ตัวเลือกหรือการ'append'
ตั้งค่าของaction
ตัวเลือก (ขึ้นอยู่กับว่าคุณต้องการให้อินเทอร์เฟซผู้ใช้ทำงานอย่างไร)
nargs
parser.add_argument('-l','--list', nargs='+', help='<Required> Set flag', required=True)
# Use like:
# python arg.py -l 1234 2345 3456 4567
nargs='+'
รับ 1 อาร์กิวเมนต์ขึ้นไปnargs='*'
ใช้ศูนย์หรือมากกว่า
ผนวก
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
ด้วยappend
คุณให้ตัวเลือกหลายครั้งที่จะสร้างขึ้นในรายการ
อย่าใช้type=list
!!! - อาจมีสถานการณ์ที่ไม่มีที่คุณต้องการที่จะใช้กับtype=list
argparse
เคย
ลองมาดูรายละเอียดเพิ่มเติมเกี่ยวกับวิธีการต่าง ๆ ที่เราอาจลองทำและผลลัพธ์สุดท้าย
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)
นี่คือผลลัพธ์ที่คุณสามารถคาดหวังได้:
$ 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']
ประเด็นที่ :
- ใช้
nargs
หรือaction='append'
nargs
สามารถตรงไปตรงมามากขึ้นจากมุมมองของผู้ใช้ แต่มันไม่ได้ตั้งใจถ้ามีข้อโต้แย้งตำแหน่งเพราะargparse
ไม่สามารถบอกได้ว่าสิ่งที่ควรจะเป็นอาร์กิวเมนต์ตำแหน่งและสิ่งที่เป็นของnargs
; หากคุณมีข้อโต้แย้งตำแหน่งแล้วaction='append'
อาจท้ายเป็นตัวเลือกที่ดีกว่า
- ข้างต้นเป็นเพียงความจริงถ้า
nargs
จะได้รับ'*'
, หรือ'+'
'?'
หากคุณระบุหมายเลขจำนวนเต็ม (เช่น4
) จะไม่มีปัญหาในการเลือกตัวเลือกการผสมnargs
และอาร์กิวเมนต์ตำแหน่งเนื่องจากargparse
จะทราบจำนวนค่าที่คาดหวังสำหรับตัวเลือก
- อย่าใช้เครื่องหมายคำพูดในบรรทัดคำสั่ง1
- อย่าใช้
type=list
เพราะมันจะส่งคืนรายการ
- สิ่งนี้เกิดขึ้นเพราะภายใต้ประทุน
argparse
ใช้ค่าของtype
การบีบบังคับให้แต่ละอาร์กิวเมนต์ที่คุณเลือกtype
ไม่ใช่การรวมของการขัดแย้งทั้งหมด
- คุณสามารถใช้
type=int
(หรืออะไรก็ได้) เพื่อรับรายการ ints (หรืออะไรก็ตาม)
1 : ฉันไม่ได้หมายถึงโดยทั่วไป .. ฉันหมายถึงการใช้คำพูดเพื่อส่งรายการargparse
ไม่ใช่สิ่งที่คุณต้องการ