2016-06-10 33 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