2008-12-24 41 views
35

Tôi đang sử dụng mô-đun optparse python trong chương trình của mình và tôi đang gặp khó khăn khi tìm cách dễ dàng để phân tích cú pháp tùy chọn chứa danh sách các giá trị.Danh sách Optparse của Python

Ví dụ:

--groups one,two,three. 

Tôi muốn để có thể truy cập vào các giá trị trong một định dạng danh sách như options.groups[]. Có tùy chọn nào khác để chuyển đổi các giá trị được tách nhau bằng dấu phẩy thành danh sách không? Hay tôi phải làm điều này bằng tay?

Trả lời

36

Nhìn vào option callbacks. hàm callback của bạn có thể phân tích các giá trị vào một danh sách bằng cách sử dụng cơ bản optarg.split(',')

78

câu trả lời S. Lott của đã được chấp nhận, nhưng đây là một mẫu mã cho các tài liệu lưu trữ:

def foo_callback(option, opt, value, parser): 
    setattr(parser.values, option.dest, value.split(',')) 

parser = OptionParser() 
parser.add_option('-f', '--foo', 
        type='string', 
        action='callback', 
        callback=foo_callback) 
9

Một lần nữa, chỉ vì lợi ích của đầy đủ lưu trữ, mở rộng ví dụ trên:

  • Bạn vẫn có thể sử dụng "đích" để chỉ định tên tùy chọn để truy cập sau
  • Mặc định giá trị không thể được sử dụng trong những trường hợp như vậy (xem giải thích trong Triggering callback on default value in optparse)
  • Nếu bạn muốn xác nhận đầu vào, OptionValueError nên được ném từ foo_callback

Mã này (với những thay đổi nhỏ) sau đó sẽ là:

def get_comma_separated_args(option, opt, value, parser): 
    setattr(parser.values, option.dest, value.split(',')) 

parser = OptionParser() 
parser.add_option('-f', '--foo', 
        type='string', 
        action='callback', 
        callback=get_comma_separated_args, 
        dest = foo_args_list) 
4

Với optparse, để có được một giá trị danh sách bạn có thể sử dụng hành động 'thêm':

from optparse import OptionParser 
parser = OptionParser() 
parser.add_option("--group", 
        action="append", 
        dest="my_groups") 
(options, args) = parser.parse_args() 
print options.my_groups 

Sau đó gọi chương trình của bạn như thế này:

$ python demo.py --group một --group hai --group ba

[ 'one', 'hai', 'ba' ]

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