Python 将字符串或列表变量追加到字符串
我的问题是,我有dict(argparse)。若标志只有一个属性,解析器将返回字符串,否则返回列表。 我基本上是在制作解析器,它将从输入参数创建命令。 例如: 所需产出:Python 将字符串或列表变量追加到字符串,python,argparse,Python,Argparse,我的问题是,我有dict(argparse)。若标志只有一个属性,解析器将返回字符串,否则返回列表。 我基本上是在制作解析器,它将从输入参数创建命令。 例如: 所需产出: "--name Myname --tags tag_1 tag_2 tag3" 我设法做到了,但我不认为这是最佳的方式:/ for k, v in kwargs.iteritems(): if v is None: continue elif not isinstance(v, basestr
"--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, tag3]
不确定我是否100%理解你的问题。 但是你为什么不能用下面的dict呢
kwargs = {"--name" : "MyName", "--tags" : ["tag_1", "tag_2", "tag_3"] }
那样的话,你的命令就是
>>> command
'your_command --name MyName --tags tag_1 tag_2 tag_3'
为了获得所需的输出,您可以尝试以下方法:
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'
此函数是否产生您想要的结果:
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'
看看
.add_argument()
的dest
关键字参数。因为我使用argparse,所以它有不同的解析方法。据我所知,我不能仅仅改变解析方式,输入可能会有很大的不同,这只是一个例子。我需要一些通用的。我的意思是,可以有'n'个列表元素和'm'个字符串元素。因为这是字典,顺序也可能不同。好吧,这和我做的差不多(除了添加“-”标记)。我更好奇的是,您是否知道获取“原始”字典格式argparse的方法,或者知道在不区分字符串和列表参数的情况下处理字符串和列表参数的方法(例如,使用argparse中的一个元素列表代替原始字符串),或者知道处理脚本输入值的某种替代方法(但不从头创建自己的类)。不过我真的很感谢你的帮助,这不是我想要的。
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)
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'