追加字符串或字符串或列表变量

时间:2017-04-04 13:56:49

标签: python argparse

我的问题是,我有dict(argparse)。如果flag只有一个属性,则解析器将返回string,否则返回list。 我基本上是在创建解析器,它将从输入args创建命令。 例如:

kwargs = {-name: "MyName", tags: ["tag_1", "tag_2", "tag_3"] }

需要输出:

"--name Myname --tags tag_1 tag_2 tag3"

我很乐意这样做,但我认为这不是最佳方式:/

for k, v in kwargs.iteritems():
    if v is None:
        continue
    elif not isinstance(v, basestring):
        print (v)
        command = command+' {} '.format(k) + ' '.join(v)
    else:
        print (v)
        command = command+' {} {}'.format(k, v)

我也使用argparse的这种方法来计算vars(argparse.parse_args())的值(这不是这个问题的一部分,但也许有人知道)。这种方式一直缺少领导' - '迹象,但我想拥有它们......很多:) 例如:

--tag tag_1 tag_2 tag_3

转换为:

[tag: tag_1, tag_2, tag3]

3 个答案:

答案 0 :(得分:1)

此功能是否产生您想要的功能:

def foo(adict):
    alist = []
    for k,v in adict.items():
        k = '--'+k
        if isinstance(v,list):
            v = ' '.join([str(i) for i in v])
        else:
            v = str(v)
        alist.append('{} {}'.format(k,v))
    return ' '.join(alist)

--添加到密钥是微不足道的。我想你可以对它进行优化,以便只将-添加到单个字符键。其余的是确保列表(以及可能的非字符串值)格式正确。

完成格式化的所有细化比尝试直接调整argparse或其输出更容易。

In [38]: args = argparse.Namespace(name="MyName", tags=['tag1','tag2'], other=12)
Out[39]: Namespace(name='MyName', other=12, tags=['tag1', 'tag2'])
In [41]: vars(args)
Out[41]: {'name': 'MyName', 'other': 12, 'tags': ['tag1', 'tag2']}
In [42]: foo(vars(args))
Out[42]: '--tags tag1 tag2 --name MyName --other 12'

答案 1 :(得分:0)

不确定我是否100%理解您的问题。 但是为什么你不能使用dict如下,

kwargs = {"--name" : "MyName", "--tags" : ["tag_1", "tag_2", "tag_3"] }

那样你的命令就是

>>> command
'your_command --name MyName --tags tag_1 tag_2 tag_3'

答案 2 :(得分:0)

为了得到你想要的输出,你可以尝试这样的事情:

kwargs = {'name': "MyName", 'tags': ["tag_1", "tag_2", "tag_3"] }
final = "--{0} {1} --{2} {3}".format(list(kwargs.keys())[0], list(kwargs.values())[0], list(kwargs.keys())[1], " ".join(list(kwargs.values())[1]))
print(final)

输出:

'--name MyName --tags tag_1 tag_2 tag_3'