我在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()');
答案 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解耦。