使用 argparse 解析 "python foo.py -DVAR1=9 -DVAR2=Off"
Parsing "python foo.py -DVAR1=9 -DVAR2=Off" with argparse
看着 ,我可以这样做:
parser=argparse.ArgumentParser()
parser.add_argument('-D',action='append',help='FOO=BAR')
options = parser.parse_args('-DVAR1=9 -DVAR2=Off'.split())
我得到:
Namespace(D=['VAR1=9', 'VAR2=Off'])
所以接着说:
[o.split('=') for o in options.D]
结果:
[['VAR1', '9'], ['VAR2', 'Off']]
这基本上是我需要的,但我觉得这是一个常见的操作,可能已经在 ArgParse
包中实现了。有没有更像 Python 的方式来做到这一点?
我认为 argparse
开发人员(以及其他 POSIX 风格的解析器)希望您定义 --dvar1
和 --dvar2
参数,而不是这种开放式方法。
其他人询问了某种通用 key=value
输入。 argparse
中没有任何内容可以直接处理。因此,像您一样收集字符串并在解析后拆分它们看起来不错。你正在做的事情和我见过的一样干净清晰。
您可以使用 type
函数拆分 on-the-fly:
In [38]: import argparse
In [39]: def foo(astr):
...: return astr.split('=')
...:
In [40]: parser=argparse.ArgumentParser()
In [41]: parser.add_argument('-D',action='append',type=foo)
Out[41]: _AppendAction(option_strings=['-D'], dest='D', nargs=None, const=None, default=None, type=<function foo at 0xab0c765c>, choices=None, help=None, metavar=None)
In [42]: options = parser.parse_args('-DVAR1=9 -DVAR2=Off'.split())
In [43]: options
Out[43]: Namespace(D=[['VAR1', '9'], ['VAR2', 'Off']])
采用不同的方法 - subclassing Action
。如果你想要,那将是必需的
namespace(VAR1='9', VAR2='Off')
(您的 post 处理循环可以将类似的属性写入 namespace
。另一个自定义技巧是定义自定义 Namespace
class,一个可以取 VAR1=9
字符串并根据需要拆分它。
看着
parser=argparse.ArgumentParser()
parser.add_argument('-D',action='append',help='FOO=BAR')
options = parser.parse_args('-DVAR1=9 -DVAR2=Off'.split())
我得到:
Namespace(D=['VAR1=9', 'VAR2=Off'])
所以接着说:
[o.split('=') for o in options.D]
结果:
[['VAR1', '9'], ['VAR2', 'Off']]
这基本上是我需要的,但我觉得这是一个常见的操作,可能已经在 ArgParse
包中实现了。有没有更像 Python 的方式来做到这一点?
我认为 argparse
开发人员(以及其他 POSIX 风格的解析器)希望您定义 --dvar1
和 --dvar2
参数,而不是这种开放式方法。
其他人询问了某种通用 key=value
输入。 argparse
中没有任何内容可以直接处理。因此,像您一样收集字符串并在解析后拆分它们看起来不错。你正在做的事情和我见过的一样干净清晰。
您可以使用 type
函数拆分 on-the-fly:
In [38]: import argparse
In [39]: def foo(astr):
...: return astr.split('=')
...:
In [40]: parser=argparse.ArgumentParser()
In [41]: parser.add_argument('-D',action='append',type=foo)
Out[41]: _AppendAction(option_strings=['-D'], dest='D', nargs=None, const=None, default=None, type=<function foo at 0xab0c765c>, choices=None, help=None, metavar=None)
In [42]: options = parser.parse_args('-DVAR1=9 -DVAR2=Off'.split())
In [43]: options
Out[43]: Namespace(D=[['VAR1', '9'], ['VAR2', 'Off']])
采用不同的方法 - subclassing Action
。如果你想要,那将是必需的
namespace(VAR1='9', VAR2='Off')
(您的 post 处理循环可以将类似的属性写入 namespace
。另一个自定义技巧是定义自定义 Namespace
class,一个可以取 VAR1=9
字符串并根据需要拆分它。