Использование optparse для чтения в списке из параметров командной строки - PullRequest
1 голос
/ 04 июля 2010

Я вызываю скрипт Python со следующей командной строкой:

myscript.py --myopt="[(5.,5.),(-5.,-5.)]"

Вопрос в том, как преобразовать myopt в переменную списка. Моим решением было использовать optparse, обрабатывая myopt как строку и используя

(options, args) = parser.parse_args()    
myopt = eval(options.myopt)

Теперь, потому что я использовал eval(), я чувствую себя немного как Добби, домашний эльф, сознательно нарушивший заповеди великих волшебников (программистов) и желая самобичевать себя в наказании.

Но есть ли лучшие варианты для разбора списков, кортежей или списков кортежей из командной строки? .. Я видел решения, использующие split(), но здесь это не сработает, так как это не простой список , Имейте также в виду, что это делается в контексте одноразовых научных вычислений без проблем с безопасностью - так что, возможно, eval() здесь не так страшно? ..

Ответы [ 2 ]

4 голосов
/ 04 июля 2010

ast.literal_eval (node_or_string):

Безопасное вычисление узла выражения или строки, содержащей выражение Python.Предоставленная строка или узел могут состоять только из следующих литеральных структур Python: строк, чисел, кортежей, списков, диктов, логических значений и None.

Это может использоваться для безопасной оценки строк, содержащих выражения Python из ненадежных источниковбез необходимости разбирать значения самостоятельно.

Так что вы можете сделать

import ast
(options, args) = parser.parse_args()    
myopt = ast.literal_eval(options.myopt)
1 голос
/ 04 июля 2010

Попробуйте 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)]
>>> 
...