โต้แย้งอาร์กิวเมนต์ตำแหน่งเพิ่มเติมหรือไม่


652

ฉันมีสคริปต์ที่ตั้งใจจะใช้เช่นนี้ usage: installer.py dir [-h] [-v]

dir เป็นอาร์กิวเมนต์ตำแหน่งซึ่งมีการกำหนดเช่นนี้:

parser.add_argument('dir', default=os.getcwd())

ฉันต้องการdirที่จะเป็นตัวเลือก: cwdเมื่อมันไม่ได้ระบุไว้มันก็ควรจะเป็น

แต่น่าเสียดายที่เมื่อฉันไม่ได้ระบุข้อโต้แย้งที่ฉันได้รับdirError: Too few arguments

คำตอบ:


825

ใช้nargs='?'(หรือnargs='*' ถ้าคุณต้องการมากกว่าหนึ่ง dir)

parser.add_argument('dir', nargs='?', default=os.getcwd())

ตัวอย่างเพิ่มเติม:

>>> import os, argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('-v', action='store_true')
_StoreTrueAction(option_strings=['-v'], dest='v', nargs=0, const=True, default=False, type=None, choices=None, help=None, metavar=None)
>>> parser.add_argument('dir', nargs='?', default=os.getcwd())
_StoreAction(option_strings=[], dest='dir', nargs='?', const=None, default='/home/vinay', type=None, choices=None, help=None, metavar=None)
>>> parser.parse_args('somedir -v'.split())
Namespace(dir='somedir', v=True)
>>> parser.parse_args('-v'.split())
Namespace(dir='/home/vinay', v=True)
>>> parser.parse_args(''.split())
Namespace(dir='/home/vinay', v=False)
>>> parser.parse_args(['somedir'])
Namespace(dir='somedir', v=False)
>>> parser.parse_args('somedir -h -v'.split())
usage: [-h] [-v] [dir]

positional arguments:
  dir

optional arguments:
  -h, --help  show this help message and exit
  -v

14
ทำ?และ*หมายถึงสิ่งเดียวกันกับที่พวกเขาหมายถึงในการแสดงออกปกติ (เช่น?ต้องใช้ 0 หรือ 1 และ*ต้องการ 0 หรือมากกว่า)? ถ้าเป็นเช่นนั้นจะ+ทำงานเช่นกัน?
Dolan Antenucci

37
@dolan: ใช่+ทำงานได้เหมือนกัน ดูdocs.python.org/2/library/argparse.html#nargsสำหรับรายละเอียด
Vinay Sajip

2
มีวิธีที่จะให้ dir แสดงในอาร์กิวเมนต์ตัวเลือก? หรือดูเหมือนว่าอาร์กิวเมนต์ตำแหน่งควรมีตัวเลือก 'ทางเลือก' ที่มาก่อน เป็นไปได้หรือไม่ที่จะลงทะเบียน (เท่าที่เกี่ยวข้องกับความช่วยเหลือ) เป็นเช่นนี้?
scagnetti

6
@ant จากด้านบนคุณจะเห็นว่า dir เป็นทางเลือก (ปรากฏในวงเล็บเหลี่ยมในเอาต์พุต argparse ระบุถึงสิ่งนี้)
Vinay Sajip

1
Tx! เข้าถึง dir จากoptions.dirไม่ใช่args.dirอย่างที่ฉันพยายาม!
ptim

69

เป็นส่วนขยายของ @VinaySajip คำตอบ มีnargsมูลค่าการกล่าวขวัญเพิ่มเติม

  1. parser.add_argument('dir', nargs=1, default=os.getcwd())

N (จำนวนเต็ม) ไม่มีข้อโต้แย้งจากบรรทัดคำสั่งจะถูกรวบรวมเข้าด้วยกันเป็นรายการ

  1. parser.add_argument('dir', nargs='*', default=os.getcwd())

'*' อาร์กิวเมนต์บรรทัดคำสั่งทั้งหมดที่มีอยู่จะถูกรวบรวมไว้ในรายการ โปรดทราบว่าโดยทั่วไปแล้วมันไม่มีเหตุผลมากนักที่จะมีอาร์กิวเมนต์มากกว่าหนึ่งตำแหน่งnargs='*'แต่อาจมีอาร์กิวเมนต์ตัวเลือกหลายตัวพร้อมnargs='*'กัน

  1. parser.add_argument('dir', nargs='+', default=os.getcwd())

'+' เช่นเดียวกับ '*' การรวบรวมบรรทัดคำสั่งทั้งหมดจะถูกรวบรวมไว้ในรายการ นอกจากนี้ข้อความแสดงข้อผิดพลาดจะถูกสร้างขึ้นหากไม่มีอาร์กิวเมนต์บรรทัดคำสั่งอย่างน้อยหนึ่งรายการ

  1. parser.add_argument('dir', nargs=argparse.REMAINDER, default=os.getcwd())

argparse.REMAINDER. อาร์กิวเมนต์บรรทัดคำสั่งที่เหลือทั้งหมดจะถูกรวบรวมไว้ในรายการ สิ่งนี้มีประโยชน์โดยทั่วไปสำหรับโปรแกรมอรรถประโยชน์บรรทัดคำสั่งที่ส่งไปยังโปรแกรมอรรถประโยชน์บรรทัดคำสั่งอื่น ๆ

หากnargsไม่ได้ระบุอาร์กิวเมนต์คำหลักจำนวนอาร์กิวเมนต์ที่ใช้จะถูกกำหนดโดยการกระทำ โดยทั่วไปหมายถึงอาร์กิวเมนต์บรรทัดคำสั่งเดียวจะถูกใช้และรายการเดียว (ไม่ใช่รายการ) จะถูกสร้างขึ้น

แก้ไข (คัดลอกจากความคิดเห็นโดย @Acumenus) nargs='?' เอกสารพูดว่า: '?' อาร์กิวเมนต์หนึ่งรายการจะถูกใช้จากบรรทัดคำสั่งหากเป็นไปได้และสร้างเป็นรายการเดียว หากไม่มีอาร์กิวเมนต์บรรทัดคำสั่งจะมีการสร้างค่าจากค่าเริ่มต้น


3
มันควรจะสังเกต แต่ที่nargs='?'ไม่ได้ผลิตรายการ
คิวเมนตัส

@ABB บรรทัดสุดท้ายของคำตอบGenerally this means a single command-line argument will be consumed and a single item (not a list) will be produced.หวังว่าสิ่งนี้จะช่วย ...
Matas Vaitkevicius

1
บรรทัดที่ยกมาอ้างถึงกรณีที่ไม่ได้กำหนดnargsแต่nargs='?'กำหนดไว้ เอกสารบอกว่า: '?' อาร์กิวเมนต์หนึ่งรายการจะถูกใช้จากบรรทัดคำสั่งหากเป็นไปได้และสร้างเป็นรายการเดียว หากไม่มีอาร์กิวเมนต์บรรทัดคำสั่งจะมีการสร้างค่าจากค่าเริ่มต้น
คิวเมนตัส

@ABB เพียงแก้ไขคำตอบหากคุณรู้สึกว่ามีบางอย่างขาดหายไป ขอบคุณ
Matas Vaitkevicius

อะไรคือความแตกต่างระหว่างnargs=argparse.REMAINDERและnargs='*'ตามที่ฉันคิดว่ามันเหมือนกันในเอฟเฟกต์ของพวกเขา (ทดสอบใน Python 2.7.10 และ Python 3.6.1)

-5

parser.add_argumentนอกจากนี้ยังมีสวิทช์ที่จำเป็น required=Falseคุณสามารถใช้ นี่เป็นตัวอย่างข้อมูลด้วย Python 2.7:

parser = argparse.ArgumentParser(description='get dir')
parser.add_argument('--dir', type=str, help='dir', default=os.getcwd(), required=False)
args = parser.parse_args()

11
OP ได้ถามเกี่ยวกับ params ตำแหน่งไม่ใช่ '--dir' 'ต้องระบุ' เป็นอาร์กิวเมนต์ที่ไม่ถูกต้องสำหรับตำแหน่ง และ 'เท็จ' เป็นตัวพิมพ์ผิดเธอหมายถึง 'เท็จ' +1 สำหรับมือใหม่ -1 สำหรับความสะเพร่า
SoloPilot
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.