2013-06-06 11 views
8

私はargparseマニュアルのいくつかの時間を費やすが、私はまだ私のプログラム内の1つのオプションのために、このモジュールで苦労しています:パイソン、argparse:持っているどのようにNARGSタイプ= 2 = STRとタイプ= INT

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

最初の引数は文字列(type = str)で必須ですが、2番目の引数はtype = intで、値が指定されていない場合はデフォルト値を持ちます(デフォルト= 50とします) 。私は、1つの議論しか期待できないときにそれを行う方法を知っていますが、nargs = 2のときにどのように進めるべきかわかりません...それは可能ですか?

多くのおかげで、

答えて

0

私は2つの引数を使用することをお勧めします:

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

あなたは次のことを行うことができます。 requiredキーワードは、フィールド必須設定し、指定されていない場合default=50は50のオプションのデフォルト値を設定します。

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 

出力:

$ 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

を、私はマイクの解決策に同意する傾向があるが、ここでは別です方法。それは理想的ではありません。なぜなら、usage/help文字列は1つ以上の引数を使用するようにユーザーに指示するからです。

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 

ということで、あなたが得る:私は、引数を持っているとして、あなたの答えのための

>>> 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

おかげで、私は多くのオプションを作成するために避けたいだろうが、私は、それは確かに最も簡単な方法だと思います! – Bux31

関連する問題