2016-06-10 29 views
1

有没有办法为np.array而不是列表添加一个参数给ArgumentParser? 我知道我可以做这样的事情numpy array的参数parser

import argparse 
parser = argparse.ArgumentParser(prog='PROG') 
parser.add_argument('-foo', action='store', type=int, nargs='+') 
args = parser.parse_args(['-foo', '1', '2']) 
args.foo = np.array(args.foo) 

但我想解析之前指定的参数的完整描述。

有没有办法做到这一点?

+1

你会在哪里指定这个'complete description'?在命令行中,还是在'add_argument'设置中?举一个更详细的例子。 – hpaulj

回答

2

要指定StoreAction操作处理程序是如何工作的,你会创建一个适当的变化处理程序的subclass(该文档有一个例子权上述this section

import argparse, numpy as np 

class Store_as_array(argparse._StoreAction): 
    def __call__(self, parser, namespace, values, option_string=None): 
     values = np.array(values) 
     return super().__call__(parser, namespace, values, option_string) 

parser = argparse.ArgumentParser(prog='PROG') 
parser.add_argument('-foo', action=Store_as_array, type=int, nargs='+') 
            #^specify as the action 
args = parser.parse_args(['-foo', '1', '2']) 

assert isinstance(args.foo, np.ndarray) 
+0

这正是我所期待的。谢谢。 – Tohiko

0

正如指出的轻微改变我评论,'解析前的完整描述'不清楚。

但我想到它有可能创建一个与​​2d阵列。我可以使用nargs=3指定3列,并使用action='append'收集多个子列表中的输入。当然type指定它是int还是float。

In [27]: p=argparse.ArgumentParser() 

In [28]: p.add_argument('-a',action='append',nargs='+',type=int) 
Out[28]: _AppendAction(option_strings=['-a'], dest='a', nargs='+', const=None, default=None, type=<class 'int'>, choices=None, help=None, metavar=None) 

In [29]: args=p.parse_args('-a 1 2 3 -a 4 5 6 -a 7 8 9'.split()) 

In [30]: args 
Out[30]: Namespace(a=[[1, 2, 3], [4, 5, 6], [7, 8, 9]]) 

In [31]: np.array(args.a) 
Out[31]: 
array([[1, 2, 3], 
     [4, 5, 6], 
     [7, 8, 9]]) 

如果我没有合适的列数,它会投诉。所有它不能控制的是行数;但是我可以在创建后轻松检查数组的形状。

用这个appendaction中创建数组没有任何意义。即使使用1d输入,在解析过程中执行np.array调用也没有什么优势。解析后按摩(并测试)args值是非常好的做法。

虽然要将数组值放入一个CSV文件中,并且通过​​指定该文件的名称会更好。​​真的不是为了输入大量的值。这不是一个通用的文件解析器。命令行控制你的代码的行为。

+0

我的意思是当@Tadhg显示的参数添加到ArgumentParser时指定参数的描述(类型,默认值和全部)。 – Tohiko