我使用以下命令行调用python脚本:
myscript.py --myopt="[(5.,5.),(-5.,-5.)]"
问题是 - 如何将myopt转换为列表变量。我的解决方案是使用optparse,将myopt视为字符串,并使用
(options, args) = parser.parse_args()
myopt = eval(options.myopt)
现在,因为我使用eval()
我觉得有点像家养小精灵多比,故意违反了伟大(编码)巫师的诫命,并且想要在惩罚中自我鞭挞。
但是从命令行解析列表或元组或元组列表是否有更好的选择?我见过使用split()
的解决方案,但这不适用于此,因为这不是简单清单。还要记住,这是在大多数一次性科学计算的背景下完成的,没有安全问题 - 所以也许eval()
在这里并不那么邪恶?..
答案 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)]
>>>