2011-05-02 39 views
6

Tại sao không phân tích cú pháp các đối số này?Argparse thứ tự không chính xác của các tham số vị trí và tùy chọn

--foo 1 2 3 bar 

Sử dụng

parser = argparse.ArgumentParser() 
parser.add_argument('--foo', nargs='+')     
parser.add_argument('bar') 

mang đến cho các lỗi sau:

error: too few arguments

Nếu tôi vượt qua đối số thanh đầu tiên, mặc dù nó hoạt động:

bar --foo 1 2 3 

Bây giờ, điều này bản thân nó không quá tệ. Tôi có thể sống với việc có các đối số vị trí đầu tiên nó chỉ rằng hành vi này là không phù hợp với sự giúp đỡ argparse tạo ra cho chúng ta, trong đó nêu rằng thanh nên cuối cùng:

usage: argparsetest.py [-h] [--foo FOO [FOO ...]] bar

Vì vậy, làm thế nào để bạn thực hiện công việc này với sự giúp đỡ văn bản phù hợp ?

Dưới đây là hoàn tất test program.

+0

Đã chuyển sang cùng một vấn đề ngay bây giờ. Người ta có thể sử dụng '--' để kết thúc' nargs' globbing, vì vậy '--foo 1 2 3 - bar' sẽ làm việc trong ví dụ trên của bạn. Nó thực sự cần được giải quyết tự động, đặt số lượng các đối số cần thiết cho các đối số vị trí, theo ý kiến ​​của tôi. Có các cuộc thảo luận về vấn đề mở này tại http://bugs.python.org/issue9338 và http://bugs.python.org/issue9182 (ít nhất nó phải được ghi chép rõ ràng). –

Trả lời

3

Có thể thử làm cờ đầu vào - đầu ra và đặt các tùy chọn đó thành bắt buộc = Đúng trong add_argument?

http://docs.python.org/dev/library/argparse.html#the-add-argument-method

+0

Cảm ơn, điều đó hoạt động và mang lại cho tôi văn bản trợ giúp nhất quán. Hạn chế duy nhất là phần cờ thêm đầu vào nhưng tôi có thể sống với điều đó. Chúc mừng – Reimund

+0

Để xóa mọi thứ, giải pháp được đề xuất là sử dụng parser.add_argument ('- bar', required = True). Người ta có thể vượt qua các đối số sau đây: --foo 1 2 3 - thanh bar – Reimund

4

nargs='+' yêu cầu argparse thu thập tất cả các số còn lại cùng nhau, do đó, bar được bao gồm. Nó không có cách kỳ diệu để đoán bạn có ý định bar là một đối số có ý nghĩa của chính nó và không phải là một phần của args đưa đến --foo.

Ví dụ trong tài liệu đề cập đến một đối số đơn giản --foo, không phải là một với nargs='+'. Hãy chắc chắn để hiểu sự khác biệt.

+1

Sẽ dễ thực hiện nó sao cho các đối số n cuối cùng được coi là n đối số vị trí bắt buộc. Nó không phải là ma thuật, tôi đoán nó chỉ là một quyết định thiết kế. – Reimund

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