Как заставить argparse.ArgumentParser возвращать кортеж или массив np.array, а не список при использовании параметра nargs? - PullRequest
0 голосов
/ 16 мая 2018

Я хочу проанализировать опцию с несколькими аргументами и вернуть значение как коллекцию по своему выбору, например, tuple или np.array, а не list.

Я мог бы просто преобразоватьрезультирующий список после разбора, как предложено в этом ответе ,

parser.add_argument('--foo', nargs='*')
options = parser.parse_args('--foo 1 2 3'.split())
# manual casts go here
options.foo = tuple(options.foo)

, но это может быть громоздким и подверженным ошибкам esp.если у нас много таких параметров для преобразования.

Возможно ли, чтобы ArgParser сама сохраняла аргументы в коллекции, отличной от списка?

1 Ответ

0 голосов
/ 16 мая 2018

Это возможно путем создания настраиваемого действия. Например,

import argparse
import numpy as np

def collect_as(coll_type):
  class Collect_as(argparse.Action):
    def __call__(self, parser, namespace, values, options_string=None):
      setattr(namespace, self.dest, coll_type(values))
  return Collect_as

parser = argparse.ArgumentParser()
parser.add_argument('--foo', nargs='*', type=int, action=collect_as(tuple))
parser.add_argument('--bar', nargs='*', type=np.float32, action=collect_as(np.array))
options = parser.parse_args('--foo 1 2 3 --bar 4 5 6'.split())
print(options)
# Namespace(bar=array([4., 5., 6.], dtype=float32), foo=(1, 2, 3))
...