我正在使用以下命令行调用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)

10-04 13:20