从 Python 中的 ArgumentParser 解析的 args 创建 arg 字符串

Ben*_*ris 8 python argparse

如果我有一个argparser.ArgumentParser, 加上一个从 返回的命名空间parser.parse_args,是否有一种简单的方法可以将命名空间转换回 argv 列表,以便它们可以传递回程序?本质上,是否有 parse_args 的反函数?

一个示例场景:

parser = argparse.ArgumentParser()
parser.add_argument('--example', type=int, default=0)
args = parser.parse_args(argv)

args.example *= 2
new_argv = parser.generate_argv(args)
Run Code Online (Sandbox Code Playgroud)

所以如果我打电话:

python my_program.py --example 1
Run Code Online (Sandbox Code Playgroud)

我想回来:

new_argv = ['--example', '2']
Run Code Online (Sandbox Code Playgroud)

hpa*_*ulj 3

在我们深入讨论这个问题之前,让我们先澄清一下。 args=parser.parse_args()是相同的args=parser.parse_args(sys.argv[1:])。但我可以想象你想知道什么sys.argv[1:]会产生一些任意的情况args。也许是为了测试,也许是为了驱动别人的代码。

没有任何代码可以argparse做到这一点。但对于有限的情况,您可以从定义的操作中获取信息,并创建一个合理的sys.argv.

In [432]: parser = argparse.ArgumentParser()    
In [433]: parser.add_argument('--example', type=int, default=0)
Out[433]: _StoreAction(option_strings=['--example'], dest='example', nargs=None, const=None, default=0, type=<type 'int'>, choices=None, help=None, metavar=None)
Run Code Online (Sandbox Code Playgroud)

已定义操作的列表:

In [435]: parser._actions
Out[435]: 
[_HelpAction(option_strings=['-h', '--help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help='show this help message and exit', metavar=None),
 _StoreAction(option_strings=['--example'], dest='example', nargs=None, const=None, default=0, type=<type 'int'>, choices=None, help=None, metavar=None)]
Run Code Online (Sandbox Code Playgroud)

选择感兴趣的一个,然后查看它的一些属性:

In [436]: a1=parser._actions[-1]
In [437]: a1.type
Out[437]: int
In [438]: a1.default
Out[438]: 0
Run Code Online (Sandbox Code Playgroud)

现在生成args

In [439]: args=parser.parse_args(['--example','1'])    
In [440]: args
Out[440]: Namespace(example=1)
In [441]: args.example *= 2
Run Code Online (Sandbox Code Playgroud)

args使用来自操作的新信息创建列表的简单示例。显然,工作代码需要推断出要使用哪个操作。对于最常见的类型str()就足够了。

In [442]: if args.example != a1.default:
   .....:     print(['--example',str(args.example)])
   .....:     
['--example', '2']
Run Code Online (Sandbox Code Playgroud)

或者我可以使用metavar属性和usage格式化程序:

In [445]: a1.metavar=str(args.example)
In [446]: parser.print_usage()
usage: ipython2.7 [-h] [--example 2]
Run Code Online (Sandbox Code Playgroud)