ทบทวนข้อกำหนด
- ใช้
argparse
(ฉันจะไม่สนใจอันนี้)
- อนุญาตให้เรียกหนึ่งหรือสองการดำเนินการ (จำเป็นอย่างน้อยหนึ่งรายการ)
- พยายามโดย Pythonic (ฉันอยากจะเรียกว่า "POSIX" เหมือน)
นอกจากนี้ยังมีข้อกำหนดโดยนัยบางประการเมื่ออยู่ในบรรทัดคำสั่ง:
- อธิบายการใช้งานให้ผู้ใช้เข้าใจได้ง่าย
- ตัวเลือกจะเป็นทางเลือก
- อนุญาตให้ระบุแฟล็กและอ็อพชัน
- อนุญาตให้รวมกับพารามิเตอร์อื่น ๆ (เช่นชื่อไฟล์หรือชื่อ)
ตัวอย่างการแก้ปัญหาโดยใช้docopt
(ไฟล์managelog.py
):
"""Manage logfiles
Usage:
managelog.py [options] process -- <logfile>...
managelog.py [options] upload -- <logfile>...
managelog.py [options] process upload -- <logfile>...
managelog.py -h
Options:
-V, --verbose Be verbose
-U, --user <user> Username
-P, --pswd <pswd> Password
Manage log file by processing and/or uploading it.
If upload requires authentication, you shall specify <user> and <password>
"""
if __name__ == "__main__":
from docopt import docopt
args = docopt(__doc__)
print args
ลองเรียกใช้:
$ python managelog.py
Usage:
managelog.py [options] process -- <logfile>...
managelog.py [options] upload -- <logfile>...
managelog.py [options] process upload -- <logfile>...
managelog.py -h
แสดงความช่วยเหลือ:
$ python managelog.py -h
Manage logfiles
Usage:
managelog.py [options] process -- <logfile>...
managelog.py [options] upload -- <logfile>...
managelog.py [options] process upload -- <logfile>...
managelog.py -h
Options:
-V, --verbose Be verbose
-U, --user <user> Username
-P, --pswd <pswd> P managelog.py [options] upload -- <logfile>...
Manage log file by processing and/or uploading it.
If upload requires authentication, you shall specify <user> and <password>
และใช้มัน:
$ python managelog.py -V -U user -P secret upload -- alfa.log beta.log
{'--': True,
'--pswd': 'secret',
'--user': 'user',
'--verbose': True,
'-h': False,
'<logfile>': ['alfa.log', 'beta.log'],
'process': False,
'upload': True}
ทางเลือกสั้น ๆ short.py
อาจมีตัวแปรที่สั้นกว่านี้ได้:
"""Manage logfiles
Usage:
short.py [options] (process|upload)... -- <logfile>...
short.py -h
Options:
-V, --verbose Be verbose
-U, --user <user> Username
-P, --pswd <pswd> Password
Manage log file by processing and/or uploading it.
If upload requires authentication, you shall specify <user> and <password>
"""
if __name__ == "__main__":
from docopt import docopt
args = docopt(__doc__)
print args
การใช้งานมีลักษณะดังนี้:
$ python short.py -V process upload -- alfa.log beta.log
{'--': True,
'--pswd': None,
'--user': None,
'--verbose': True,
'-h': False,
'<logfile>': ['alfa.log', 'beta.log'],
'process': 1,
'upload': 1}
โปรดทราบว่าแทนที่จะเป็นค่าบูลีนสำหรับคีย์ "กระบวนการ" และ "อัปโหลด" จะมีตัวนับ
ปรากฎว่าเราไม่สามารถป้องกันการซ้ำซ้อนของคำเหล่านี้:
$ python short.py -V process process upload -- alfa.log beta.log
{'--': True,
'--pswd': None,
'--user': None,
'--verbose': True,
'-h': False,
'<logfile>': ['alfa.log', 'beta.log'],
'process': 2,
'upload': 1}
ข้อสรุป
การออกแบบอินเทอร์เฟซบรรทัดคำสั่งที่ดีอาจเป็นเรื่องท้าทายในบางครั้ง
มีหลายแง่มุมของโปรแกรมที่ใช้บรรทัดคำสั่ง:
- การออกแบบบรรทัดคำสั่งที่ดี
- การเลือก / ใช้โปรแกรมแยกวิเคราะห์ที่เหมาะสม
argparse
มีข้อเสนอมากมาย แต่ จำกัด สถานการณ์ที่เป็นไปได้และอาจซับซ้อนมาก
เมื่อdocopt
สิ่งต่างๆสั้นลงมากในขณะที่ยังคงรักษาความสามารถในการอ่านและให้ความยืดหยุ่นในระดับสูง หากคุณจัดการการรับอาร์กิวเมนต์ที่แยกวิเคราะห์จากพจนานุกรมและทำการแปลงบางส่วน (เป็นจำนวนเต็มการเปิดไฟล์ .. ) ด้วยตนเอง (หรือโดยไลบรารีอื่นที่เรียกว่าschema
) คุณอาจพบว่าdocopt
เหมาะสมสำหรับการแยกวิเคราะห์บรรทัดคำสั่ง
-x
เป็นธงสากลและเป็นทางเลือก ตัด-
ถ้าจำเป็น