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

1 投票
2 回答
930 浏览
提问于 2025-04-16 00:48

我用以下命令行来调用一个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)

撰写回答