В чем разница между eval, exec и compile?

DELIMITER $$
CREATE PROCEDURE GenerateRangeDates(IN dateStart DATE, IN dateEnd DATE)
BEGIN

    CREATE TEMPORARY TABLE IF NOT EXISTS dates (day DATE);

    loopDate: LOOP
        INSERT INTO dates(day) VALUES (dateStart); 
        SET dateStart = DATE_ADD(dateStart, INTERVAL 1 DAY);

        IF dateStart <= dateEnd 
            THEN ITERATE loopDate;
            ELSE LEAVE loopDate;
        END IF;
    END LOOP loopDate;

    SELECT day FROM dates;
    DROP TEMPORARY TABLE IF EXISTS dates;

END 
$$

-- Call procedure
call GenerateRangeDates( 
        now() - INTERVAL 40 DAY,
        now()
    );
381
задан martineau 12 October 2018 в 19:10
поделиться

1 ответ

  1. exec не является выражением: оператором в Python 2.x и функцией в Python 3.x. Он компилирует и немедленно оценивает оператор или набор операторов, содержащихся в строке. Пример:

     exec ('print (5)') # выводит 5. 
     # exec 'print 5', если вы используете Python 2.x, ни exec, ни print там не являются функцией {{1 }} exec ('print (5) \ nprint (6)') # выводит 5 {новая строка} 6. 
    exec ('if True: print (6)') # выводит 6. 
    exec ('5') # ничего не делает и ничего не возвращает. 
     
  2. eval - встроенная функция ( не оператор), которая оценивает выражение и возвращает значение, которое производит выражение. Пример:

     x = eval ('5') # x <- 5 
    x = eval ('% d + 6'% x) # x <- 11 
    x = eval ( 'abs (% d)'% -100) # x <- 100 
    x = eval ('x = 5') # INVALID; присвоение не является выражением. 
    x = eval ('if 1: x = 4') # INVALID; if - это инструкция, а не выражение. 
     
  3. compile - это версия нижнего уровня exec и eval . Он не выполняет и не оценивает ваши операторы или выражения, но возвращает объект кода, который может это сделать. Доступны следующие режимы:

    1. compile (string, '', 'eval') возвращает объект кода, который был бы выполнен, если бы вы выполнили eval (string) . Обратите внимание, что вы не можете использовать операторы в этом режиме; только одно (одно) выражение действительно.
    2. compile (string, '', 'exec') возвращает объект кода, который был бы выполнен, если бы вы выполнили exec (string) . Здесь вы можете использовать любое количество утверждений.
    3. compile (string, '', 'single') похож на режим exec , но игнорирует все, кроме первого оператора. Обратите внимание, что оператор if / else с его результатами считается одним оператором.
192
ответ дан 22 November 2019 в 23:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: