2016-05-21 15 views
7

Có thể sử dụng argparse để chụp một bộ đối số tùy ý không?Có thể sử dụng argparse để nắm bắt một tập hợp tùy ý các đối số tùy chọn không?

Ví dụ cả những điều sau đây nên được chấp nhận như là đầu vào:

python script.py required_arg1 --var1 value1 --var2 value2 --var3 value3 

python script.py required_arg1 --varA valueA --var2 value2 --varB valueB 

tiên Tôi không biết những gì đối số tùy chọn sẽ được xác định nhận nhưng sẽ xử lý chúng cho phù hợp.

Trả lời

8

Đây là loại một cách hackish, nhưng nó hoạt động rất tốt:

Kiểm tra, đối số nào không được thêm và thêm chúng

parser=argparse.ArgumentParser() 
parser.add_argument("foo") 
parser.add_argument("-bar", type=int) 
#parser can have any arguments, whatever you want! 

parsed, unknown = parser.parse_known_args() #this is an 'internal' method 
# which returns 'parsed', the same as what parse_args() would return 
# and 'unknown', the remainder of that 
# the difference to parse_args() is that it does not exit when it finds redundant arguments 

for arg in unknown: 
    if arg.startswith(("-", "--")): 
     #you can pass any arguments to add_argument 
     parser.add_argument(arg, type=<your type>, ...) 

args=parser.parse_args() 

Ví dụ:

python arbitrary_parser.py ha -bar 12 -lol huhu -rofl haha 

Sau đó, kết quả sẽ là

args = Namespace(bar=12, foo='ha', lol='huhu', rofl='haha') 
+3

Một trong những câu trả lời trước đó sử dụng 'parse_known_args', nhưng sau đó sử dụng' cái phong cách sys.argv' của phân tích cho 'unknown'. Tôi thích ý tưởng của bạn về việc thêm những lá cờ đó vào trình phân tích cú pháp và phân tích cú pháp lại. Yêu cầu khắt khe đòi hỏi các giải pháp tấn công. :) – hpaulj

3

Có thể? có thể, nhưng tôi sẽ không giới thiệu nó. argparse là công cụ không tốt nhất để phân tích cú pháp kiểu nhập này hoặc ngược lại, đây là đặc điểm kỹ thuật đối số kém từ góc nhìn argparse.

Bạn có nghĩ về dòng usage sẽ trông như thế nào không? Làm cách nào để giải thích điều này cho người dùng của bạn?

Bạn phân tích cú pháp này hoạt động như thế nào từ số sys.argv trực tiếp? Có vẻ như bạn có thể thu thập 3 miếng:

prog = sys.argv[0] 
arg1 = sys.argv[1] 
keys = sys.argv[2::2] 
# maybe strip -- off each 
values = sys.argv[3::2] 
kvdict = {k:v for k, v in zip(keys, values)} 

Có các câu hỏi SO khác về cặp chung key:value. Những điều thích:

--args key1:value1 key2:value2 

này có thể được xử lý với nargs='*' và một hành động mà chia mỗi chuỗi đầu vào : (hoặc =) và các cửa hàng thứ bởi key.

Yêu cầu của bạn ít nhất là tuân theo việc sử dụng argparse vì yêu cầu bỏ qua toàn bộ ý tưởng cờ đối số phù hợp với các chuỗi trong argv. Nó đòi hỏi, một số cách, tắt tất cả phân tích cú pháp bình thường argparse.

Hình như tôi đã gợi ý điều tương tự một vài năm trước đây

Parse non-pre-defined argument

hoặc sớm hơn

Using argparse to parse arguments of form "arg= val"

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