2015-02-20 12 views
8

Tôi muốn chỉ định một đối số bắt buộc được gọi là inputdir nhưng tôi cũng muốn có phiên bản viết tắt của nó được gọi là i. Tôi không nhìn thấy một giải pháp ngắn gọn để làm điều này mà không làm cho cả hai đối số tùy chọn và sau đó làm kiểm tra của riêng tôi. Có một thực hành ưa thích cho điều này mà tôi không nhìn thấy hoặc cách duy nhất là làm cho cả hai tùy chọn và làm xử lý lỗi của riêng tôi?Làm thế nào để tạo một phiên bản ngắn và dài của một đối số được yêu cầu bằng Python Argparse?

Đây là mã của tôi:

import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument("inputdir", help="Specify the input directory") 
parser.parse_args() 

Trả lời

11

Đối cờ (tùy chọn bắt đầu với - hoặc --) vượt qua trong tùy chọn với cờ. Bạn có thể chỉ định nhiều lựa chọn:

parser.add_argument('-i', '--inputdir', help="Specify the input directory") 

Xem name or flags option documentation:

Phương pháp add_argument() phải biết liệu một đối số tùy chọn, như -f hoặc --foo, hoặc một đối số vị trí, giống như một danh sách các tên tập tin, là kỳ vọng. Các đối số đầu tiên được chuyển đến add_argument() do đó phải là một chuỗi cờ hoặc một tên đối số đơn giản.

Demo:

>>> import argparse 
>>> parser = argparse.ArgumentParser() 
>>> parser.add_argument('-i', '--inputdir', help="Specify the input directory") 
_StoreAction(option_strings=['-i', '--inputdir'], dest='inputdir', nargs=None, const=None, default=None, type=None, choices=None, help='Specify the input directory', metavar=None) 
>>> parser.print_help() 
usage: [-h] [-i INPUTDIR] 

optional arguments: 
    -h, --help   show this help message and exit 
    -i INPUTDIR, --inputdir INPUTDIR 
         Specify the input directory 
>>> parser.parse_args(['-i', '/some/dir']) 
Namespace(inputdir='/some/dir') 
>>> parser.parse_args(['--inputdir', '/some/dir']) 
Namespace(inputdir='/some/dir') 

Tuy nhiên, yếu tố đầu tiên cho cần lập luận chỉ là một giữ chỗ. --- tùy chọn là luôn luôn tùy chọn (đó là quy ước dòng lệnh), đối số bắt buộc không bao giờ được chỉ định với các công tắc như vậy. Thay vào đó, trợ giúp dòng lệnh sẽ hiển thị vị trí đặt đối số bắt buộc bằng trình giữ chỗ dựa trên đối số đầu tiên được chuyển đến add_argument(), được chuyển vào mà không có dấu gạch ngang.

Nếu bạn có để phá vỡ với ước đó và sử dụng một cuộc tranh cãi bắt đầu với - hoặc -- đó là yêu cầu nào, bạn sẽ phải làm kiểm tra của riêng bạn:

args = parser.parse_args() 
if not args.inputdir: 
    parser.error('Please specify an inputdir with the -i or --inputdir option') 

Ở đây parser.error() method sẽ in thông tin trợ giúp cùng với thông báo lỗi của bạn, sau đó thoát.

+0

Cảm ơn bạn rất nhiều vì đã làm rõ! Tối đánh giá rất cao sự giúp đỡ của bạn. – user3621633

+0

Điều mà tôi không thích, là khi nó in ra sử dụng, nó không in ra '-i' và' --inputdir'. Tôi sẽ muốn việc sử dụng giống như 'usage: [-h] [-i | --inputdir INPUTDIR]'; một cái gì đó để có hiệu lực đó. Có lẽ một cách để làm điều đó là sử dụng 'add_mutually_exclusive_group()', nhưng điều đó có vẻ hơi khó hiểu đối với tôi. Tôi tự hỏi nếu có một cách tốt hơn. – searchengine27

+0

@ searchengine27: bạn phải tùy chỉnh [lớp trình định dạng trợ giúp] (https://docs.python.org/2/library/argparse.html#formatter-class), tôi lo sợ. –

Các vấn đề liên quan