Вопрос не в том, «почему есть *
не принимается», а скорее «почему есть +
принято вообще».
ast.literal_eval
может анализировать литералы, но не выражения. Однако в Python комплексные числа не выражаются как одно буквальное значение; вместо этого они состоят из реальной части и мнимой части, объединенной вместе; мнимая часть сигнализируется j
. literal_eval
, таким образом, необходимо поддерживать двоичные файлы +
и -
для поддержки комплексных констант чисел, таких как 1 + 2j
или -3.4e-5 - 1.72e9j
.
Во многих версиях, включая Python 3.5, literal_eval
гораздо более слабым, чем это нужно быть - она принимает любую цепочку сложения и вычитания для тех пор, пока обе левые и правые оценки в любой число, таким образом, (1 + 3) + 2 + (4 - 5)
все еще анализируется, даже если он не является сложной константой, состоящей из реальной + мнимой части.
+
и -
не принимаются безоговорочно: если вы пытаетесь добавить 2 списков вместе, это не получится, даже если он может разобрать список литералов, а сложение определяется для списков:
>>> ast.literal_eval('[1] + [2]')
Traceback (most recent call last):
...
ValueError: malformed node or string: <_ast.BinOp object at 0x7fdddbe785f8>
>>> ast.literal_eval('[1, 2]')
[1, 2]
>>> [1] + [2]
[1, 2]
' аст.literal_eval' менее мощный и, следовательно, менее опасен, чем простой eval. Думаю, это делает его менее двух оценок: :) –