2010-07-04 1 views
1

Я зову питон скрипт с помощью следующей командной строки:Использования optparse для чтения в списке из параметров командной строки

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

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

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

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

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

ответ

4

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) 
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)] 
>>>