2017-02-12 6 views
1

У меня следующая проблема с моей программой:SyntaxError: неверный синтаксис, положение о '=' в Eval() функция

File "C:/Users/6ixpage/Documents/SoftwareDevelopment/Python/Programs/CLI/ 
PrintandCopy/P&C Job System.py", line 75, in set 
    eval('self.details['+a+'].'+b+'"'+c+'"'); 
File "<string>", line 1 
    self.details[0].file = "image" 
         ^
SyntaxError: invalid syntax 

Вот фрагмент кода для справки:

IN = ('details','0','file','image') 
if IN[0] == 'details': 
    a = IN[1] 
    b = IN[2] 
    c = IN[3] 
    print('self.details['+a+'].'+b+' = "'+c+'"'); 
    eval('self.details['+a+'].'+b+' = "'+c+'"'); 
  • IN[0] - используется для идентификации того, что команда указывает детали папки. *
  • IN[1] - задача в папке. *
  • IN[2] - атрибут задачи (любой тип, файл, количество, подсчет). *
  • IN[3] - значение для установки атрибута.

Весь код here, к сожалению, недокументирован, поскольку изначально я хотел иметь только простую установку CUI. Но будьте викторины, если у вас есть какие-либо вопросы о конкретных фрагментах. У меня также есть документация на бумаге, которая показывает, как должна работать программа.

Если вы можете предложить некоторые изменения в том, как работает CUI, особенно если они будут вызывать меньше головных болей, чем тот, который у меня есть. (И я уверен, что я не должен использовать eval() для каждой функции.)

+4

'eval' оценивает выражение. Назначение - это утверждение, а не выражение, поэтому вы не можете сделать это с помощью 'eval'. Используйте ответ от @ Jérôme – Duncan

ответ

5

Из комментария Дункана:

eval evaluates an expression. Assignment is a statement, not an expression so you can't do it with eval .

Вы можете использовать exec (см this answer для объяснения о exec и eval), но серьезно, нет необходимости обфускации кода с ними.

Вот что вы можете сделать:

inputs = ('details','0','file','image') 
if inputs[0] == 'details': 
    a = inputs[1] 
    b = inputs[2] 
    c = inputs[3] 
    setattr(self.details[int(a)], b, c) 

(Примечание нет теста Все входы считаются действительными.).

Объяснение:

  • int(a) превращает строку '0' в целое число 0 ,
  • setattr наборы атрибутов 'file' из self.details[0] в 'image'

Вы должны рассмотреть eval и exec последнее прибежище вещи. Скорее всего, вам не нужны эти места в вашем коде.

Например

eval('print(self.'+str(arg)+')') 

должны быть написаны

print(getattr(self, arg)) 
+0

Большое спасибо, это изменение в программе отлично работает и заставляет его выглядеть очень аккуратно^O^ –

0

Задания не допускаются в функции eval; попробуйте вместо этого использовать exec.

+0

exec может работать здесь, но, пожалуйста, не используйте его, когда вы можете написать простой код. –

+1

В общем, 'eval' и' exec' не используются; их полезность - это случаи, когда требуется динамическое выполнение кода из внешнего источника. – FluxIX

+1

Таким образом, все риски связаны с произвольным выполнением неподтвержденного кода. Кроме того, отладка такого выполнения кода (особенно ошибок во внешнем коде) может быть проблемой, поскольку обычные методы отладки могут быть недоступны. (Приносим извинения за позднее изменение - случайное представление исходного комментария.) – FluxIX