使用的常用方法是定義解析器,填充其「參數」,並調用parse_args()
來解析命令行。
parse_args()
返回您隨後使用的Namespace對象。
它可以直接定義命名空間對象:
In [203]: ns = argparse.Namespace(x=12, y='abc')
In [204]: ns
Out[204]: Namespace(x=12, y='abc')
In [205]: ns.x
Out[205]: 12
In [206]: nx.z
....
NameError: name 'nx' is not defined
In [207]: ns.z = [1,2,3]
In [208]: ns
Out[208]: Namespace(x=12, y='abc', z=[1, 2, 3])
可以將值添加到現有的對象,但你不能訪問是沒有定義的值。 Namespace
類很簡單,只需添加一些方法來顯示更漂亮的值。
你也可以從它那裏得到一本字典:
In [209]: vars(ns)
Out[209]: {'x': 12, 'y': 'abc', 'z': [1, 2, 3]}
In [210]: list(vars(ns).keys())
Out[210]: ['z', 'y', 'x']
抓取使用key
字符串值:
In [212]: getattr(ns,'x')
Out[212]: 12
您也可以按名稱設置屬性
In [220]: setattr(ns,'w','other')
In [221]: ns
Out[221]: Namespace(w='other', x=12, y='abc', z=[1, 2, 3])
的ns
用於顯示其值的方法是:
def __repr__(self):
type_name = type(self).__name__
arg_strings = []
for arg in self._get_args():
arg_strings.append(repr(arg))
for name, value in self._get_kwargs():
arg_strings.append('%s=%r' % (name, value))
return '%s(%s)' % (type_name, ', '.join(arg_strings))
def _get_kwargs(self):
return sorted(self.__dict__.items())
self.__dict__
是一回事vars(ns)
給出。這些屬性存儲在這個字典中(對於大多數對象,尤其是用戶定義的對象)。
如果你想用Namespace
做更多,或者定義你自己的班級,我建議你看看argparse.py
文件中的班級。試圖對這個類的本質做出最少的假設。它儘可能使用getattr
和setattr
函數。而hasattr
還有:
In [222]: hasattr(ns, 'foo')
Out[222]: False
In [223]: hasattr(ns, 'w')
Out[223]: True
從你編輯它聽起來像你想從命名空間中的屬性名稱,以「恢復」的選項標誌。也就是說
parser.add_argument('--foo', '-f', ...)
parser.add_argument('bar', ...)
parser.add_argument('--other', dest='baz',...)
會產生Namespace(foo=..., bar=....)
屬性的名字叫做dest
。即保存值當解析器使用
setattr(namespace, dest, value)
對於一個位置參數的dest
是在上面的例子中第一參數,「酒吧」。對於可選參數,dest
從第一個長參數,即上面的' - foo'派生。或者可以使用明確的dest='baz'
參數進行設置。
因此,簡單地將--
添加到ns.__dict__
密鑰是一個開始。
中沒有任何可以從解析結果重新創建命令行的代碼。
錯誤,這不是使用'argparse'的常見方法... – wim
你甚至認爲「獲取關鍵行爲的名稱」是什麼意思? – user2357112
@ user2357112,類似於'parser.action .__ name__'返回行動' – Gang