คำถามนี้มีคำตอบที่ได้รับการโหวตสูงและเป็นคำตอบที่ได้รับการยอมรับแล้ว แต่ทั้งหมดนี้ถูกเบี่ยงเบนความสนใจด้วยวิธีการต่างๆในการแสดงปัญหาบูลีนและพลาดประเด็นสำคัญ:
ฉันมีสคริปต์ python ที่สามารถรับอาร์กิวเมนต์บรรทัดคำสั่งเป็นศูนย์หรือสาม (ไม่ว่าจะทำงานตามพฤติกรรมเริ่มต้นหรือต้องการทั้งสามค่าที่ระบุ)
ตรรกะนี้ไม่ควรเป็นความรับผิดชอบของโค้ดของคุณตั้งแต่แรกแต่ควรจัดการโดยargparse
โมดูล อย่ากังวลกับการเขียนคำสั่ง if ที่ซับซ้อนให้ตั้งค่าตัวแยกวิเคราะห์อาร์กิวเมนต์ของคุณแทนดังนี้:
#!/usr/bin/env python
import argparse as ap
parser = ap.ArgumentParser()
parser.add_argument('--foo', nargs=3, default=['x', 'y', 'z'])
args = parser.parse_args()
print(args.foo)
และใช่มันควรจะเป็นตัวเลือกที่ไม่ได้เป็นอาร์กิวเมนต์ตำแหน่งเพราะมันเป็นหลังจากที่ทุกตัวเลือก
แก้ไข: ที่อยู่ที่ความกังวลของ LarsH ในความคิดเห็นด้านล่างนี้เป็นตัวอย่างของวิธีที่คุณสามารถเขียนมันถ้าคุณมีบางอย่างที่คุณต้องการติดต่อกับทั้ง 3 หรือ 0ตำแหน่ง args ฉันมีความเห็นว่าอินเทอร์เฟซก่อนหน้านี้มีสไตล์ที่ดีกว่าเนื่องจากอาร์กิวเมนต์ที่เป็นทางเลือกควรเป็นตัวเลือกแต่นี่คือแนวทางอื่นเพื่อความสมบูรณ์ สังเกต kwarg ที่ลบล้างusage
เมื่อสร้างโปรแกรมแยกวิเคราะห์ของคุณเพราะargparse
จะสร้างข้อความการใช้งานที่ทำให้เข้าใจผิดโดยอัตโนมัติ!
#!/usr/bin/env python
import argparse as ap
parser = ap.ArgumentParser(usage='%(prog)s [-h] [a b c]\n')
parser.add_argument('abc', nargs='*', help='specify 3 or 0 items', default=['x', 'y', 'z'])
args = parser.parse_args()
if len(args.abc) != 3:
parser.error('expected 3 arguments')
print(args.abc)
นี่คือตัวอย่างการใช้งานบางส่วน:
# default case
wim@wim-zenbook:/tmp$ ./three_or_none.py
['x', 'y', 'z']
# explicit case
wim@wim-zenbook:/tmp$ ./three_or_none.py 1 2 3
['1', '2', '3']
# example failure mode
wim@wim-zenbook:/tmp$ ./three_or_none.py 1 2
usage: three_or_none.py [-h] [a b c]
three_or_none.py: error: expected 3 arguments