2010-04-07 28 views
7

Sử dụng python optparse.py, có cách nào đó để xác định xem giá trị tùy chọn cụ thể đã được đặt từ dòng lệnh hay từ giá trị mặc định.Làm thế nào để biết nếu tùy chọn optparse được chuyển trong dòng lệnh hoặc là mặc định

Lý tưởng nhất là tôi muốn có một dict giống như mặc định, nhưng có chứa các tùy chọn thực sự cung cấp từ dòng lệnh

Tôi biết rằng bạn có thể so sánh giá trị cho mỗi tùy chọn với giá trị mặc định, nhưng điều này sẽ không phân biệt được một giá trị được truyền qua dòng lệnh khớp với giá trị mặc định.

Cảm ơn!


EDIT

Xin lỗi phân nhịp ban đầu của tôi là không phải là rất rõ ràng.

Tôi có một số lượng lớn tập lệnh được gọi từ tệp theo lô. Đối với mục đích kiểm toán, tôi muốn báo cáo về các tùy chọn được thông qua và liệu chúng có được chuyển từ dòng lệnh, mặc định hoặc một số phương tiện khác vào tệp nhật ký hay không.

Sử dụng mặc định, bạn có thể biết liệu tùy chọn có khớp với giá trị mặc định hay không, nhưng điều đó vẫn không cho bạn biết liệu nó có thực sự được cung cấp từ dòng lệnh hay không. Điều này có thể có liên quan: nếu một tùy chọn được chuyển từ dòng lệnh và đồng ý với mặc định, nếu bạn sau đó thay đổi mặc định trong mã, tập lệnh sẽ vẫn nhận được cùng một giá trị.

Với tôi, bạn sẽ cảm thấy khá tự nhiên khi có giá trị mặc định, chứa các giá trị thực sự được cung cấp.

Để làm cho bê tông câu hỏi, trong ví dụ này:

>>> sys.argv = ['myscript.py','-a','xxx'] 
>>> import optparse 
>>> parser = optparse.OptionParser() 
>>> parser.add_option('-a', default = 'xxx') 
>>> parser.add_option('-b', default = 'yyy') 

Làm thế nào để tôi biết rằng lựa chọn một đã được thông qua từ dòng lệnh. Cách duy nhất để phân tích cú pháp dòng lệnh theo cách thủ công?

(Tôi biết đây là một điểm khá nhỏ, nhưng tôi nghĩ rằng nó sẽ là giá trị yêu cầu trong trường hợp tôi là thiếu smthing trên optparse)

Cảm ơn một lần nữa

+2

Nhưng không phải là điểm mặc định để ngăn bạn phải lo lắng tùy chọn nào được chuyển - không cần biết liệu chúng có khớp với các giá trị mặc định hay không? –

+0

Có lẽ điều này có nghĩa là bạn cần một tùy chọn khác? – codeape

+0

xin vui lòng xem chỉnh sửa của tôi, đây là về kiểm toán, do đó, nó làm cho một sự khác biệt như thế nào kịch bản được gọi. – user265454

Trả lời

3

Không biết bạn mã là không thể để cung cấp cho câu trả lời tốt hơn, nhưng ...

  1. chỉ cần không chuyển giá trị mặc định cho trình phân tích cú pháp và kiểm tra giá trị None. Giá trị None là giá trị mặc định cho optparse lib để bạn có thể truy xuất mặc định của riêng mình và hoạt động như thường lệ;

  2. mở rộng optparse để chuyên dùng.

Tôi không biết chương trình của bạn nhưng thường không phải là hành vi thay đổi thiết kế tốt khi cấu hình giống nhau.

6

Thay vì mã soạn sẵn dưới đây:

opts, args = parser.parse_args() 

nếu bạn sử dụng đoạn mã dưới đây, bạn sẽ có một giá trị bổ sung đối tượng opts_no_defaults với các tùy chọn đã được quy định một cách rõ ràng bởi người sử dụng:

opts_no_defaults = optparse.Values() 
__, args = parser.parse_args(values=opts_no_defaults) 
opts = Values(parser.get_default_values().__dict__) 
opts._update_careful(opts_no_defaults.__dict__) 

Cuối cùng, opts phải giống hệt như trong mã bản mẫu đầu tiên.

print opts_no_defaults.__dict__ 
print opts.__dict__ 
for opt in parser._get_all_options(): 
    if opt.dest: 
     print "Value of %s: %s" % (opt._long_opts[0], getattr(opts, opt.dest)) 
     print "Is %s specified by user? %s" % (opt._long_opts[0], hasattr(opt_no_defaults, opt.dest)) 
+0

Thật tuyệt! Tôi đã xem xét để tạo ra một tùy chỉnh 'OptionParser.get_default_values ​​()' trả về một 'giá trị' tùy chỉnh để theo dõi liệu giá trị có mặc định hay không. – haridsv

1
def is_opt_provided (parser, dest): 
    if any (opt.dest == dest and (opt._long_opts[0] in sys.argv[1:] or opt._short_opts[0] in sys.argv[1:]) for opt in parser._get_all_options()): 
     return True 
    return False  

Cách sử dụng:

parser = OptionsParser() 
parser.add_option('-o', '--opt', dest='opt_var', ...) 

if is_opt_provided(parser, 'opt_var'): 
    print "Option -o or --opt has been provided" 

Nó sẽ là tuyệt vời nếu bảo trì Python bao gồm các chức năng gợi ý để lớp OptionParser.

+0

Điều này là rất không đáng tin cậy vì nó sẽ trả về false + ve ngay cả khi chuỗi tùy chọn khớp với một cái gì đó trong các đối số. – haridsv

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