使用optparse从命令行选项读取列表
我用以下命令行来调用一个Python脚本:
myscript.py --myopt="[(5.,5.),(-5.,-5.)]"
我的问题是——如何把myopt转换成一个列表变量。我想到的解决办法是使用optparse,把myopt当作字符串来处理,然后使用
(options, args) = parser.parse_args()
myopt = eval(options.myopt)
现在,因为我用了eval()
,我感觉有点像家养小精灵多比,心里有些不安,觉得自己违反了伟大(编程)巫师的法则,想要自我惩罚一下。
但是有没有更好的方法来从命令行解析列表、元组或者元组的列表呢?我见过一些用split()
的方法,但在这里不适用,因为这不是一个简单的列表。还要记住,这主要是在做一些一次性的科学计算,没有安全方面的顾虑——所以也许在这里用eval()
并不是那么可怕?
2 个回答
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)]
>>>
3
ast.literal_eval(node_or_string):
这个函数可以安全地评估一个表达式节点或者一个包含Python表达式的字符串。你提供的字符串或节点只能包含以下几种Python的基本数据结构:字符串、数字、元组、列表、字典、布尔值和None。
这个功能可以用来安全地评估来自不可信来源的字符串中的Python表达式,而不需要自己去解析这些值。
所以你可以这样做:
import ast
(options, args) = parser.parse_args()
myopt = ast.literal_eval(options.myopt)