你明白这是怎么回事吗?
{'LAT': '40.5949799', 'LNG': '-73.9495148', 'command': 'location_by_coordinate', '**kwargs': 'DISTANCE=3000'}
arguments
字典?您定义了一个名为“**kwargs”的“位置”参数(“dest”)。您也可以将其命名为“foobar”。解析器将字符串“DISTANCE=3000”分配给该属性args
命名空间,它变成了字典键:值对arguments
.
当然,您可以寻找arguments['**kwargs']
,并自己解析该值:
v = arguments['**kwargs'] # or pop if you prefer
if v is not None:
k, v = v.split('=')
arguments[k] = int(v)
它可以泛化为处理多个对(用 `nargs='*' 定义)。
argparse
处理参数的方式与 Python 函数不同,因此没有什么完全类似的**kwargs
.
接受类似事情的正常方式distance
带有“可选”或标记的参数。
parser.add_argument('-d','--distance', type=int, help=...)
它将接受
python argstest.py location_by_coordinate 40.5949799 -73.9495148 --distance=3000
python argstest.py location_by_coordinate 40.5949799 -73.9495148 --distance 3000
python argstest.py location_by_coordinate 40.5949799 -73.9495148 --d3000
python argstest.py location_by_coordinate 40.5949799 -73.9495148
也可以设置为使用--DISTANCE
或其他名称。在最后一种情况下args
命名空间将有一个默认值distance
。默认的默认值是None
.
这是直接添加的方法kwarg
就像论据argparse
.
接受任意字典,如对,distance:3000
, distance=3000
,之前曾被问过。答案总是我上面概述的解析的一些变体。它可以在自定义 Action 类中完成,或者按照我的建议进行后解析。
哎呀,这个答案几乎是我几天前写的答案的克隆:https://stackoverflow.com/a/33639147/901925
2011年类似的问题:使用 argparse 解析“arg= val”形式的参数
Python argparse 字典 arg
===================================
(edit)
带有一个函数的示例*args
:
In [2]: import argparse
In [3]: def foo(*args, **kwargs):
...: print('args',args)
...: print('kwargs',kwargs)
...:
In [4]: parser=argparse.ArgumentParser()
In [5]: parser.add_argument('arg1')
In [6]: parser.add_argument('arg2',nargs='+')
In [7]: args=parser.parse_args('one two three'.split())
In [8]: args
Out[8]: Namespace(arg1='one', arg2=['two', 'three'])
所以我有 2 个位置参数,一个具有单个字符串值,另一个具有列表(由于+
nargs).
Call foo
用这些args
属性:
In [10]: foo(args.arg1)
args ('one',)
kwargs {}
In [11]: foo(args.arg1, args.arg2)
args ('one', ['two', 'three'])
kwargs {}
In [12]: foo(args.arg1, arg2=args.arg2)
args ('one',)
kwargs {'arg2': ['two', 'three']}
我定义了“位置”,但它与“可选”同样有效。位置和可选之间的区别在命名空间中消失了。
如果我将命名空间转换为字典,我可以将值传递给foo
以各种方式,或者通过*args
或通过**kwargs
。这一切都取决于我如何称呼foo
,而不是它们的出现方式args
or arguments
。这些都不是独一无二的argparse
.
In [13]: arguments = vars(args)
In [14]: arguments
Out[14]: {'arg2': ['two', 'three'], 'arg1': 'one'}
In [15]: foo(arguments['arg2'], arguments['arg1'])
args (['two', 'three'], 'one')
kwargs {}
In [16]: foo(arguments['arg2'], arguments)
args (['two', 'three'], {'arg2': ['two', 'three'], 'arg1': 'one'})
kwargs {}
In [17]: foo(arguments['arg2'], **arguments)
args (['two', 'three'],)
kwargs {'arg2': ['two', 'three'], 'arg1': 'one'}
In [24]: foo(*arguments, **arguments)
args ('arg2', 'arg1') # *args is the keys of arguments
kwargs {'arg2': ['two', 'three'], 'arg1': 'one'}
In [25]: foo(*arguments.values(), **arguments)
args (['two', 'three'], 'one') # *args is the values of arguments
kwargs {'arg2': ['two', 'three'], 'arg1': 'one'}