Python: exec "function ()" - PullRequest
       18

Python: exec "function ()"

0 голосов
/ 04 марта 2012

Я пишу простую тестовую программу на python как часть моей большой программы, но я хотел бы передать имя подфункции в основную функцию, чтобы основная функция могла запустить подфункцию.

Например:

import datetime;

def cronjob(repeat, interval, task):
    if (str(repeat) == 'inf'):
        repeat = 99999999999999999999;
    position = 0;
    interval = datetime.timedelta(seconds=interval);
    x = datetime.datetime.now()
    while not (position >= repeat):
        while (datetime.datetime.now() - x < interval):
            pass;
        x = datetime.datetime.now();
        position += 1;
        exec task;

def test():
    print "hello";

cronjob(10, 0.1, 'test');

РЕДАКТИРОВАТЬ: Это уже исправлено, но, поскольку здесь ничего не указано, позвольте мне показать вам, как это сделать на случай, если это кому-то еще нужно.() и exec, и попытался просто eval (задача).это не выдало ошибку, поэтому я попытался распечатать eval (задачу) и, конечно же, в нем был указан адрес памяти функции [то есть test ()].наконец, я использовал eval (задачу);затем вызвать эту функцию.ниже код, исправляющий это:

import datetime;

def cronjob(repeat, interval, task):
    if (str(repeat) == 'inf'):
        repeat = 99999999999999999999;
    position = 0;
    interval = datetime.timedelta(seconds=interval);
    x = datetime.datetime.now()
    while not (position >= repeat):
        while (datetime.datetime.now() - x < interval):
            pass;
        x = datetime.datetime.now();
        position += 1;
        eval(task);

def test():
    print "hello";

cronjob(10, 0.1, 'test()');

Ответы [ 3 ]

2 голосов
/ 04 марта 2012

Почему бы не передать сам объект функции в планировщик?

test - это объект, который также может использоваться в качестве аргумента!

def test():
  print "test"

def exe(func):
  func()

exe(test)
0 голосов
/ 04 марта 2012

В случае, если вы абсолютно уверены, что хотите извлечь функцию из строки, вы можете использовать dict как отображение строк в функции следующим образом:гораздо более безопасным (поскольку действия могут исходить извне) и обеспечивает лучшую развязку внутренней структуры кода от внешнего API.

0 голосов
/ 04 марта 2012

Я считаю, что поскольку функции являются объектами, вы можете просто передать один из них "управляющей" функции по имени, поэтому вам не нужен вызов exec (который обычно используется для динамического выполнения кода).* Например,

def foo(a_number, a_function):
    print a_number
    a_number += 1
    a_function(a_number)

def bar(another_number):
    print another_number

foo(5, bar)

должен выдавать результат:
5
6

...