2011-12-07 31 views
5

Ứng dụng của tôi là một tiện ích so sánh tập tin chuyên dụng và rõ ràng là không có ý nghĩa khi so sánh chỉ một tệp, vì vậy nargs='+' không hoàn toàn phù hợp.Có thể lập luận trong python 2.7 được yêu cầu yêu cầu tối thiểu hai đối số?

nargs=N chỉ chấp nhận tối đa N đối số, nhưng tôi cần phải chấp nhận số lượng đối số vô hạn miễn là có ít nhất hai đối số.

+0

Ngoài ra, hãy xem http://stackoverflow.com/quest các ion/4194948/python-argparse-là-có-một-cách-để-chỉ định-một-phạm vi-trong-nargs. Điều đó cho phép sự linh hoạt hơn, mà không gây rối (hoặc lộn xộn) với văn bản trợ giúp. – Evert

Trả lời

5

Không thể bạn làm điều gì đó như thế này:

import argparse 

parser = argparse.ArgumentParser(description = "Compare files") 
parser.add_argument('first', help="the first file") 
parser.add_argument('other', nargs='+', help="the other files") 

args = parser.parse_args() 
print args 

Khi tôi chạy này với -h tôi nhận được:

usage: script.py [-h] first other [other ...] 

Compare files 

positional arguments: 
    first  the first file 
    other  the other files 

optional arguments: 
    -h, --help show this help message and exit 

Khi tôi chạy nó chỉ với một đối số, nó sẽ không làm việc :

usage: script.py [-h] first other [other ...] 
script.py: error: too few arguments 

Nhưng hai hoặc nhiều đối số là tốt. Với ba lý lẽ nó in:

Namespace(first='one', other=['two', 'three']) 
17

Câu trả lời ngắn là bạn không thể làm điều đó bởi vì nargs không hỗ trợ cái gì đó như '2+'.

Long trả lời là bạn có thể workaround rằng việc sử dụng một cái gì đó như thế này:

parser = argparse.ArgumentParser(usage='%(prog)s [-h] file file [file ...]') 
parser.add_argument('file1', nargs=1, metavar='file') 
parser.add_argument('file2', nargs='+', metavar='file', help=argparse.SUPPRESS) 
namespace = parser.parse_args() 
namespace.file = namespace.file1 + namespace.file2 

Các thủ đoạn mà bạn cần là:

  • Sử dụng usage cung cấp cho bạn sở hữu chuỗi sử dụng để phân tích cú pháp
  • Sử dụng metavar để hiển thị đối số có tên khác trong chuỗi trợ giúp
  • Sử dụng SUPPRESS để tránh hiển thị trợ giúp cho một trong các biến
  • Merge hai biến khác nhau chỉ cần thêm một thuộc tính mới cho đối tượng Namespace rằng phân tích cú pháp trả

Ví dụ trên tạo ra chuỗi trợ giúp sau:

usage: test.py [-h] file file [file ...] 

positional arguments: 
    file 

optional arguments: 
    -h, --help show this help message and exit 

và sẽ vẫn không thành công khi ít hơn hai đối số được thông qua:

$ python test.py arg 
usage: test.py [-h] file file [file ...] 
test.py: error: too few arguments 
Các vấn đề liên quan