Python:exec“function()”

时间:2012-03-04 06:39:45

标签: python string function exec eval

我在python中编写一个简单的测试程序作为我的更大程序的一部分,但我想将一个子函数名称传递给main函数,因此main函数可以运行子函数。

例如:

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');
编辑:已经解决了这个问题,但由于这里没有列出任何内容,让我告诉你如何做以防万一其他人需要它。

我摆弄了eval()和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 个答案:

答案 0 :(得分:2)

为什么不将函数对象本身传递给调度程序?

test是一个对象,也可以用作参数!

def test():
  print "test"

def exe(func):
  func()

exe(test)

答案 1 :(得分:0)

我相信因为函数是对象,所以你可以通过名称将一个函数传递给“控制”函数,因此你不需要exec调用(通常用于动态代码执行)。

e.g。

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

答案 2 :(得分:0)

如果您确定要从字符串派生函数,可能需要使用dict作为从字符串到函数的映射,如下所示:

dispatcher = {'dothis': module1.do_this,
              'dothat': module2.to_that}

def foo(fun):
    fun(arg1, arg2)

def bar(action):
    fun = dispatcher.get(action)
    if fun:
       foo(fun)

这样会更加安全(因为操作可能来自外部)并且可以更好地将内部代码结构与外部API解耦。