Python 解析非预定义参数

Python 解析非预定义参数,python,argparse,Python,Argparse,是否有任何库可以在Python的sys.argv中解析随机键值对 例如: python run.py --v1 k1 --v2 k2 --v3 k3 应该还给我一本像{v1->k1,v2->k2,v3->k3}这样的字典。在编译时,我不知道这些“v”是什么 谢谢 埃尔本(Erben)有点黑,但你确实有: import argparse import collections parser = argparse.ArgumentParser() known, unknown_args = par

是否有任何库可以在Python的sys.argv中解析随机键值对

例如:

 python run.py --v1 k1 --v2 k2 --v3 k3
应该还给我一本像{v1->k1,v2->k2,v3->k3}这样的字典。在编译时,我不知道这些“v”是什么

谢谢


埃尔本(Erben)

有点黑,但你确实有:

import argparse
import collections
parser = argparse.ArgumentParser()
known, unknown_args = parser.parse_known_args()

unknown_options = collections.defaultdict(list)
key = None
for arg in unknown_args:
    if arg.startswith('--'):
        key = arg[2:]
    else:
        unknown_options[key].append(arg)

在使用字典理解的较新Python中,可以使用如下一行:

ll = sys.argv[1:]
args = {k[2:]:v for k,v in zip(ll[::2], ll[1::2])}
# {'v1': 'k1', 'v2': 'k2', 'v3': 'k3'}
它没有任何灵活性,以防您的用户将配对搞砸,但这将是一个快速的开始

生成器可用于弹出
sys.argv[1://code>中的字符串对。这将是构建灵活性和错误检查的好地方

def foo(ll):
    ll = iter(ll)
    while ll:
        yield ll.next()[2:], ll.next()
{k:v for k,v in foo(ll)}

你打算如何使用那些你事先不知道的名字呢?我建议使用类似于
--var v1=k1--var v2=k2--var v3=k3的选项,而不是用python制作一个工具,它需要一个模板文件和一堆k-v对。与Jinja2类似,此解决方案将为中间没有值的连续键提供非常意外的结果(例如,当使用
--foo--bar--baz
参数运行时),是的,它将。。。但这不是OP指定的输入。。如果它像他的例子一样狭窄,这将很好地工作:P。。。如果他需要更多的智慧。。。它很容易改变,以适应简单的东西的需要。。。如果他需要更高级的东西,他应该使用注释中建议的
--var name=val
语法。基本上,这个解决方案会让询问者完全停留在他开始的地方——需要一个库来解析意外选项列表。而且它可以很容易地优化到
unknown_args=sys.argv
,因为它实际上就是这样做的。哦,你说得对,那太糟糕了。我现在添加了更多的代码。顺便说一句,sys.argv还有其他东西,比如脚本名称,但还不完善,因为我们必须手动搜索未知参数中的“-”。但parse_known_args解决的一个问题是,无论顺序如何,它都返回未知的_args。i、 e.您可以有--known_k1 v1--unknown_k2 v2--known_k3 v2,它将过滤掉已知的args
argparse
sys.argv[1://code>开头。如果没有其他参数要处理,可以跳过
argparse
部分。
def foo(ll):
    ll = iter(ll)
    while ll:
        yield ll.next()[2:], ll.next()
{k:v for k,v in foo(ll)}