使用optparse从命令行选项中读取列表

时间:2010-07-04 17:46:39

标签: python parsing eval

我使用以下命令行调用python脚本:

myscript.py --myopt="[(5.,5.),(-5.,-5.)]"

问题是 - 如何将myopt转换为列表变量。我的解决方案是使用optparse,将myopt视为字符串,并使用

(options, args) = parser.parse_args()    
myopt = eval(options.myopt)

现在,因为我使用eval()我觉得有点像家养小精灵多比,故意违反了伟大(编码)巫师的诫命,并且想要在惩罚中自我鞭挞。

但是从命令行解析列表或元组或元组列表是否有更好的选择?我见过使用split()的解决方案,但这不适用于此,因为这不是简单清单。还要记住,这是在大多数一次性科学计算的背景下完成的,没有安全问题 - 所以也许eval()在这里并不那么邪恶?..

2 个答案:

答案 0 :(得分:4)

ast.literal_eval(node_or_string):

  

安全地评估表达式节点或   包含Python的字符串   表达。字符串或节点   提供的可能只包括   遵循Python文字结构:   字符串,数字,元组,列表,   dicts,booleans和None。

     

这可用于安全评估   包含Python表达式的字符串   来自不受信任的来源,没有   需要自己解析价值观。

所以你可以做到

import ast
(options, args) = parser.parse_args()    
myopt = ast.literal_eval(options.myopt)

答案 1 :(得分:1)

请尝试使用JSON。语法不完全是Python,但足够接近。

>>> import json
>>> json.loads("[[5.0,5.0],[-5.0,-5.0]]")
[[5.0, 5.0], [-5.0, -5.0]]
>>> [tuple(p) for p in json.loads("[[5.0,5.0],[-5.0,-5.0]]")]
[(5.0, 5.0), (-5.0, -5.0)]
>>>