Chương trình của tôi nên bao gồm các tùy chọn sau, phân tích đúng bằng argparse:Python 2.7 argparse: Làm thế nào để lồng các đối số độc quyền tùy chọn khác nhau đúng cách?
- hoàn toàn không bắt buộc:
[-h, --help]
và[-v, --version]
- loại trừ lẫn nhau:
[-f FILE, --file FILE]
và[-u URL, --url URL]
- tùy chọn nếu
--url
được chọn:[-V, --verbose]
- cần nếu hoặc là
--file
hoặc--url
đã được chọn:[-F, --format FORMAT]
Các mô hình sử dụng mong muốn sẽ là:
prog.py [-h] [-v] [-f FILE (-F FORMAT) | -u URL [-V] (-F FORMAT) ]
với yêu cầu -F
áp dụng cho cả hai thành viên của nhóm loại trừ lẫn nhau.
Không chắc chắn rằng đó có phải là positional hay không.
Vì vậy, chúng ta có thể để chạy:
prog.py -u "http://foo.bar" -V -F csv
và phân tích cú pháp la hét trong trường hợp tôi quên -F
(như ông là nghĩa vụ phải).
Những gì tôi đã làm như vậy cho đến nay:
parser = ArgumentParser(decription='foo')
group = parser.add_mutually_exclusive_group()
group.add_argument('-f','--file', nargs=1, type=str, help='')
group.add_argument('-u','--url', nargs=1, type=str, help='')
parser.add_argument('-V','--verbose', action='store_true', default=False, help='')
parser.add_argument('-F','--format', nargs=1, type=str, help='')
Kể từ khi nó có một 'chế độ vani' để chạy mà không cần đối số dòng lệnh, tất cả các đối số phải là bắt buộc.
Làm cách nào tôi có thể triển khai điểm 3. và 4. vào mã của mình?
EDIT:
tôi đã cố gắng -f
và -u
như subparsers, như mô tả here, nhưng lệnh con dường như bị đối xử như positionals và phân tích cú pháp mang lại cho tôi một error: too few arguments
nếu tôi chạy nó không có đối số.
bạn đã xem [docopt] (http://docopt.org/) chưa? Điểm bất lợi là nó cho phép các giá trị tùy chọn bắt đầu bằng '-' [ví dụ,' "-fa -F -u" '(định dạng là" -u "ở đây)] (https://gist.github.com/zed/b94e3e9945debe25826d) – jfs
Là một trong các '-f' và' -u' được yêu cầu? Nếu vậy, tôi đang hình dung một giải pháp liên quan đến các tiểu ban hoặc các đối số vị trí. – chepner
@chepner: không, chúng không có. tôi muốn chương trình cũng chạy mà không có args và tùy chọn, do đó, nó sẽ bắt đầu một hộp thoại người dùng hoặc thậm chí một GUI – ferkulat