2012-06-11 32 views
5

Tôi đã có một chương trình với một số lượng lớn các arg tiềm năng. Về cơ bản, nó cho phép người sử dụng get/set/delete/list bất kỳ bảng nào trong một cơ sở dữ liệu rất nhỏ. Mỗi cột có một arg có thể được thông qua.
Đây không phải là giao diện chính, chỉ là giao diện quản trị hữu ích đôi khi.Làm thế nào để kết hợp nhắc nhở tương tác với argparse trong python?

Nhưng dù sao, nếu người dùng muốn chèn hàng vào bảng, anh ta phải biết tên của tất cả các cột. Trong khi nó dễ dàng để thấy rằng từ sự giúp đỡ - nó cũng là một cơn đau ở mông.

Vì vậy, tôi đã thay đổi mã để người dùng có thể chuyển tùy chọn --prompt và chương trình sẽ nhắc họ cho mỗi tên cột được liên kết với bảng mà họ đã chỉ định. Nhưng vấn đề của tôi là bây giờ tôi cần phải lặp lại các ràng buộc đầu vào của tôi (các lựa chọn, kiểu, vv) ở hai nơi - argparse và hàm nhắc này.

  • Câu hỏi # 1: có cách nào tốt hơn để thực hiện việc này không?
  • Câu hỏi # 2: có cách nào sạch để tham khảo các ràng buộc argparse cho mục đích này không?
  • Câu hỏi # 3: có bất kỳ thư viện nào được đề xuất làm phương án thay thế kết hợp dòng lệnh args, tùy chọn và nhắc không?

Cảm ơn

Trả lời

3

Một cách thông thường để làm điều này sẽ là một hành động tùy chỉnh. Bạn có thể có tùy chọn argparse và đầu vào được xác nhận với cùng chức năng như thế này.

#!/usr/bin/env python3 

import argparse 


class ColumnsAction(argparse.Action): 
    def __call__(self, parser, namespace, value, option_string=None): 
     self.validate(parser, value) 
     setattr(namespace, self.dest, value) 

    @staticmethod 
    def validate(parser, value): 
     if value not in ('foo', 'bar'): 
      parser.error('{} not valid column'.format(value)) 


parser = argparse.ArgumentParser() 
parser.add_argument('--columns', action=ColumnsAction) 
args = parser.parse_args() 
if args.columns is None: 
    args.columns = input('Enter columns: ') 
    ColumnsAction.validate(parser, args.columns) 
print(args.columns)