我尝试使用argparse来了解解析给定列表的工作原理:
parser = argparse.ArgumentParser()
parser.add_argument('--ls', nargs='*', type=str, default = [])
Out[92]: _StoreAction(option_strings=['--ls'], dest='ls', nargs='*', const=None, default=[], type=<type 'str'>, choices=None, help=None, metavar=None)
args = parser.parse_args("--ls 'tomato' 'jug' 'andes'".split())
args
Out[94]: Namespace(ls=["'tomato'", "'jug'", "'andes'"])
args.ls
Out[96]: ["'tomato'", "'jug'", "'ande'"]
args.ls[0]
Out[97]: "'tomato'"
eval(args.ls[0])
Out[98]: 'tomato'
问题1:以上情况有效,但有没有更好的方法来访问列表中的值?
然后我用字典尝试解析给出的字典:
dict_parser = argparse.ArgumentParser()
dict_parser.add_argument('--dict', nargs='*',type=dict,default={})
Out[104]: _StoreAction(option_strings=['--dict'], dest='dict', nargs='*', const=None, default={}, type=<type 'dict'>, choices=None, help=None, metavar=None)
arg2 = dict_parser.parse_args("--dict {'name':'man', 'address': 'kac', 'tags':'don'}")
usage: -c [-h] [--dict [DICT [DICT ...]]]
-c: error: unrecognized arguments: - - d i c t { ' n a m e ' : ' m a n' , ' a d d r e s s ' : ' k a c' , ' t a g s ' : ' d o n ' }
To exit: use 'exit', 'quit', or Ctrl-D.
An exception has occurred, use %tb to see the full traceback.
SystemExit: 2
这不起作用。 Q2:上面的字典如何工作?
问题3:现在我想要
python my.py --ls tomato jug andes --dict {'name':'man', 'address': 'kac', 'tags':'don'}
要解析
我该怎么做?
我提到http://parezcoydigo.wordpress.com/2012/08/04/from-argparse-to-dictionary-in-python-2-7/
...并发现在字典下分配所有内容非常有用。有人可以简化这个任务,以便解析参数中的多种数据类型吗?
答案 0 :(得分:2)
parser.add_argument(' - ls',nargs ='*',type = str,default = []) Q1:上述工作但是有没有更好的方法来访问列表中的值?
我经常认为“更简单更好”,这是一种非常简单的做事方式,我认为没有更好的方法。但是,还有其他方法。
dict_parser.add_argument(' - dict',nargs ='*',type = dict,default = {}) arg2 = dict_parser.parse_args(“ - dict {'name':'man','address':'kac','tags':'don'}”) Q2:上面的字典如何工作?
我建议你用json解析你的字符串:
>>> class FromJSON():
... def __init__(self, string):
... self.string = string
... def decode(self):
... return json.loads(self.string)
...
>>> dict_parser.add_argument('--dict',type=FromJSON)
>>> arg2 = dict_parser.parse_args(['--dict', '{"name":"man", "address": "kac", "tags":"don"}'])
虽然JSON很像python,但它不是python。关于引用(值仅由双引号包围)和关于(没有)尾随逗号是很挑剔的。但至少它对代码注入是安全的!当然,您将用引号包围您的参数
你可能有一个解决方案来提供一个dict作为参数,它将是摆脱括号:
>>> parser.add_argument('--dict', nargs='*', type=str, default = [])
>>> args = parser.parse_args(['--dict', 'name:man', 'address:kac', 'tags:don'])
>>> args.dict = dict([arg.split(':') for arg in args.dict])
>>> print args.dict
{'tags': 'don', 'name': 'man', 'address': 'kac'}
问题3:现在我想要
python my.py --ls tomato jug andes --dict {'name':'man', 'address': 'kac', 'tags':'don'}
要解析
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--dict', type=FromJSON, default=FromJSON("{}"))
>>> parser.add_argument('--ls', nargs='*', type=str, default = [])
>>> args = parser.parse_args(['--ls', 'tomato', 'jug', 'andes', '--dict', '{"name":"man", "address": "kac", "tags":"don"}'])
>>> args.ls
['tomato', 'jug', 'andes']
>>> args.dict
<__main__.FromJSON instance at 0x7f932dd20c20>
>>> args.dict.decode()
{u'tags': u'don', u'name': u'man', u'address': u'kac'}
关于FromJSON()
,可以对其进行改进,例如:
class JsonToDict():
def __call__(self, string):
return json.loads(string)
您可以按如下方式使用:
dict_parser.add_argument('--dict',type=JsonToDict())
HTH
答案 1 :(得分:-1)
import ast
dict_parser.add_argument('--dict', nargs='*',type=ast.literal_eval,default={})
args = dict_parser.parse_args(["--dict", "{'name':'man', 'address': 'kac', 'tags':'don'}"])