以正确的方式运行由字符串>标识的函数

2024-10-01 02:28:30 发布

您现在位置:Python中文网/ 问答频道 /正文

在像芹菜这样的django应用程序中,你可以编写一个函数,把它放到一个文件中(职能部门)在特定文件夹(myFunc)中。现在,您可以在django中创建一个对象,并引用调度程序要运行的函数。你知道吗

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

简短示例

文件夹结构:

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

职能部门

def test():
  print "foo"

型号.py

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

Python管理.py外壳

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

现在我想用我的RunAFunction()类运行myFunc.func.test()。 请不要告诉我需要使用eval();)


Tags: django函数pytest文件夹应用程序modelsfunction
2条回答

第一步是只通过名称来标识函数,所以使用“test”而不是“test()”。然后您应该能够使用getattr()之类的工具在全局命名空间或其他模块中查找它。一旦在变量中有了函数,就可以打开paren并调用它。你知道吗

拆分最后一个.上的字符串以获取模块和函数名,然后使用^{}^{}获取对象:

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'funcname = 'test',然后对结果调用importlib.import_module('myApp.myFunc')getattr(module, 'test'),给出对函数的引用,然后可以调用该函数。你知道吗

相关问题 更多 >