Тип raw - это отсутствие параметра типа при использовании родового типа.
Необработанный тип не должен использоваться, потому что это может привести к ошибкам во время выполнения, например, вставить double
в то, что должно было быть Set
из int
s.
Set set = new HashSet();
set.add(3.45); //ok
При извлечении материала из Set
вы надеваете Не знаю, что выйдет. Предположим, что вы ожидаете, что это все int
s, вы отбрасываете его на Integer
; исключение во время выполнения, когда приходит double
3.45.
С параметром типа , добавленным к вашему Set
, вы сразу же получите ошибку компиляции. Эта превентивная ошибка позволяет устранить проблему, прежде чем что-то взорвется во время работы (таким образом, сэкономив время и усилия).
Set<Integer> set = new HashSet<Integer>();
set.add(3.45); //NOT ok.
Как насчет использования eval
?
EDIT См. ответ @ Ignacio с помощью ast.literal_eval
.
>>> c = eval("('item 1', [1,2,3,4] , [4,3,2,1])")
>>> c
('item 1', [1, 2, 3, 4], [4, 3, 2, 1])
Я бы рекомендовал сделать это, если вы на 100% уверены в содержимом файла.
>>> def myFunc(myString, myList1, myList2):
... print myString, myList1, myList2
...
>>> myFunc(*eval("('item 1', [1,2,3,4] , [4,3,2,1])"))
item 1 [1, 2, 3, 4] [4, 3, 2, 1]
См. ответ @ Игнасио ... намного, гораздо безопаснее.
Применение использования ast даст:
>>> import ast
>>> def myFunc(myString, myList1, myList2):
... print myString, myList1, myList2
...
>>> myFunc(*ast.literal_eval("('item 1', [1,2,3,4] , [4,3,2,1])"))
item 1 [1, 2, 3, 4] [4, 3, 2, 1]
Вы ищете ast.literal_eval()
.
>>> ast.literal_eval("('item 1', [1,2,3,4] , [4,3,2,1])")
('item 1', [1, 2, 3, 4], [4, 3, 2, 1])
eval
будет работать.
– sberry
28 January 2011 в 21:55
Возможно, вы захотите также просмотреть модуль pickle для сохранения объектов python в текстовые файлы, а затем прочитать их обратно.