2011-12-26 36 views
12
import argparse 

class customAction(argparse.Action): 
    def __call__(self, parser, args, values, option_string=None): 
     setattr(args, self.dest, values) 

parser = argparse.ArgumentParser() 
parser.add_argument('-e', '--example', action=customAction) 

Tôi muốn chuyển các đối số bổ sung cho customAction khi tùy chọn -e được kích hoạt, ví dụ: một thể hiện của một lớp khác. Tôi có thể làm cái này như thế nào? Tất cả mọi thứ tôi đã thử đã bị lỗi.Hành động tùy chỉnh của Python argparse với các đối số bổ sung được thông qua

Trả lời

31
def make_action(additional_arg): 
    class customAction(argparse.Action): 
     def __call__(self, parser, args, values, option_string=None): 
      print(additional_arg) 
      setattr(args, self.dest, values) 
    return customAction 
#... 
parser.add_argument('-e', '--example', action=make_action('your arg')) 
+8

+1 để sử dụng tốt cách đóng. –

10

giải pháp khác là để lấy được dựa lớp argparse.Action như thế này:

class CustomAction(argparse.Action): 
    def __init__(self,option_strings, 
       additional_arg1,additional_arg2, 
       dest=None, 
       nargs=0, 
       default=None, 
       required=False, 
       type=None, 
       metavar=None, 
       help=None): 
     self._a1=additional_arg1 
     self._a2=additional_arg2 
     super(CustomAction, self).__init__(
      option_strings=option_strings, 
      dest=dest, 
      nargs=nargs, 
      default=default, 
      required=required, 
      metavar=metavar, 
      type=type, 
      help=help) 
    def __call__(self, parser, namespace, values, option_string=None): 
     print(self._a1) 
     print(self._a2) 
     setattr(args, self.dest, values) 

#........ 
parser.add_argument('-e', '--example', action=CustomAction, additional_arg1='your arg', additional_arg2=42) 

Ngoài ra, cung cấp *args**kwargs đi qua bất kỳ thông số bổ sung cho các nhà xây dựng mẹ.

class CustomAction(argparse.Action): 
    def __init__(self, option_strings, additional_arg1, additional_arg2, 
       *args, **kwargs): 
     self._a1 = additional_arg1 
     self._a2 = additional_arg2 
     super(CustomAction, self).__init__(option_strings=option_strings, 
              *args, **kwargs) 
    def __call__(self, parser, namespace, values, option_string=None): 
     print(self._a1) 
     print(self._a2) 
     setattr(args, self.dest, values) 

#........ 
parser.add_argument('-e', '--example', action=CustomAction, additional_arg1='your arg', additional_arg2=42) 
+0

Nhiều như tôi yêu đóng cửa, câu trả lời này tấn công tôi như một giải pháp sạch hơn (nếu có hướng đối tượng). Bất cứ ai sử dụng điều này có thể xem xét thêm '* args' và' ** kwargs' thay vì liệt kê tất cả các đối số 'Action' mặc định của argparse. –

+0

ví dụ này tôi cần thay đổi setattr (args thành setattr (không gian tên để làm cho nó hoạt động – kdubs

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