0

在像 celery 这样的 django 应用程序中,您可以编写一个函数,将其放入特定文件夹 (myFunc) 中的文件 (func.py) 中。现在您可以在 django 中创建一个对象,并引用此函数以由调度程序运行。

我不想写一个新的芹菜,我想知道用什么技术来完成这样的行为:运行由字符串/或 CharField 引用的函数。

简短的例子

文件夹结构:

myApp
---myFunc
-----func.py
-models.py

函数.py

def test():
  print "foo"

模型.py

class RunAFunction(models.Model):
  function = models.CharField(max_length=100)

python manage.py 外壳

> from myApp.models import RunAFunction
> func = RunAFunction(function="test()")
> func.save()

现在我想myFunc.func.test()和我的RunAFunction()班级一起跑步。请不要告诉我我需要使用eval();)

4

2 回答 2

6

拆分最后一个字符串.以获取模块和函数名称,然后使用importlibandgetattr()获取对象:

import importlib
modulename, funcname = string.rsplit('.', 1)

module = importlib.import_module(modulename)
function = getattr(module, funcname)

result = function()

因此,如果string = 'myApp.myFunc.test', 则上面的代码将其拆分为'modulename = 'myApp.myFunc'and funcname = 'test',然后调用importlib.import_module('myApp.myFunc'),并getattr(module, 'test')在结果上为您提供对该函数的引用,然后可以调用该函数。

于 2013-02-21T14:01:05.943 回答
-1

第一步是仅通过名称来识别您的函数,因此使用“test”而不是“test()”。然后,您应该能够使用 getattr() 之类的方法在全局命名空间或其他模块中查找它。一旦你在变量中拥有函数,你就可以把括号放在上面并调用它。

于 2013-02-21T14:01:02.107 回答