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