2013-06-06 48 views
8

tôi dành một số thời gian trên tài liệu argparse, nhưng tôi vẫn đang phải vật lộn với mô-đun này cho một lựa chọn trong chương trình của tôi:Python, argparse: làm thế nào để có nargs = 2 với type = str và int type =

parser.add_argument("-r", "--rmsd", dest="rmsd", nargs=2, 
    help="extract the poses that are close from a ref according RMSD", 
    metavar=("ref","rmsd")) 

Tôi muốn chính xác rằng đối số đầu tiên là một chuỗi (type = str) và bắt buộc, trong khi đối số thứ hai là type = int và nếu không có giá trị nào được đặt có giá trị mặc định (giả sử mặc định = 50) . Tôi biết làm thế nào để làm điều đó khi chỉ có một đối số dự kiến, nhưng tôi không có ý tưởng làm thế nào để tiến hành khi nargs = 2 ... Điều đó thậm chí có thể?

Rất cám ơn,

Trả lời

0

Tôi muốn giới thiệu cách sử dụng hai đối số:

import argparse 

parser = argparse.ArgumentParser(description='Example with to arguments.') 

parser.add_argument('-r', '--ref', dest='reference', required=True, 
        help='be helpful') 
parser.add_argument('-m', '--rmsd', type=int, dest='reference_msd', 
        default=50, help='be helpful') 

args = parser.parse_args() 
print args.reference 
print args.reference_msd 
8

Bạn có thể làm như sau. Từ khóa required bộ lĩnh vực này bắt buộc và các default=50 đặt giá trị mặc định của tùy chọn để 50 nếu không quy định:

import argparse 

parser = argparse.ArgumentParser() 

parser.add_argument("-s", "--string", type=str, required=True) 
parser.add_argument("-i", "--integer", type=int, default=50) 

args = parser.parse_args()  
print args.string 
print args.integer 

Output:

$ python arg_parser.py -s test_string 
    test_string 
    50 
$ python arg_parser.py -s test_string -i 100 
    test_string 
    100 
$ python arg_parser.py -i 100 
    usage: arg_parser.py [-h] -s STRING [-i INTEGER] 
    arg_parser.py: error: argument -s/--string is required 
5

tôi có xu hướng đồng ý với giải pháp của Mike, nhưng đây là một đường. Nó không lý tưởng, vì chuỗi sử dụng/trợ giúp cho người dùng sử dụng 1 hoặc nhiều đối số.

import argparse 

def string_integer(int_default): 
    """Action for argparse that allows a mandatory and optional 
    argument, a string and integer, with a default for the integer. 

    This factory function returns an Action subclass that is 
    configured with the integer default. 
    """ 
    class StringInteger(argparse.Action): 
     """Action to assign a string and optional integer""" 
     def __call__(self, parser, namespace, values, option_string=None): 
      message = '' 
      if len(values) not in [1, 2]: 
       message = 'argument "{}" requires 1 or 2 arguments'.format(
        self.dest) 
      if len(values) == 2: 
       try: 
        values[1] = int(values[1]) 
       except ValueError: 
        message = ('second argument to "{}" requires ' 
           'an integer'.format(self.dest)) 
      else: 
       values.append(int_default) 
      if message: 
       raise argparse.ArgumentError(self, message)    
      setattr(namespace, self.dest, values) 
    return StringInteger 

Và với điều đó, bạn nhận được:

>>> import argparse 
>>> parser = argparse.ArgumentParser(description="") 
parser.add_argument('-r', '--rmsd', dest='rmsd', nargs='+', 
...       action=string_integer(50), 
...       help="extract the poses that are close from a ref " 
...       "according RMSD") 
>>> parser.parse_args('-r reference'.split()) 
Namespace(rmsd=['reference', 50]) 
>>> parser.parse_args('-r reference 30'.split()) 
Namespace(rmsd=['reference', 30]) 
>>> parser.parse_args('-r reference 30 3'.split()) 
usage: [-h] [-r RMSD [RMSD ...]] 
: error: argument -r/--rmsd: argument "rmsd" requires 1 or 2 arguments 
>>> parser.parse_args('-r reference 30.3'.split()) 
usage: [-h] [-r RMSD [RMSD ...]] 
: error: argument -r/--rmsd: second argument to "rmsd" requires an integer 
+0

Cám ơn câu trả lời của bạn, tôi sẽ muốn tránh để tạo ra càng nhiều tùy chọn như tôi có cãi nhau, nhưng tôi nghĩ rằng đó là cách dễ nhất thực sự ! – Bux31