Python 运行由字符串标识的函数->;正确的方法

Python 运行由字符串标识的函数->;正确的方法,python,django,function,reference,Python,Django,Function,Reference,在django应用程序(如芹菜)中,您可以编写一个函数,将其放入特定文件夹(myFunc)中的文件(func.py)中。现在,您可以在django中创建一个对象,并引用调度程序运行的该函数 我不想写一个新的芹菜,我想知道用什么技术来完成这样的行为:运行一个由字符串/或字符域引用的函数 简短示例 文件夹结构: func.py models.py python manage.py shell 现在我想用我的RunAFunction()类运行myFunc.func.test()。 请不要告诉我需要使用

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

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

简短示例

文件夹结构:

func.py

models.py

python manage.py shell

现在我想用我的
RunAFunction()
类运行
myFunc.func.test()。

请不要告诉我需要使用
eval()
;)

第一步是仅按名称标识函数,因此使用“test”而不是“test()”。然后,您应该能够使用诸如getattr()之类的工具在全局命名空间或其他模块中查找它。在变量中包含函数后,您可以打开paren并调用它。

第一步是仅按名称标识函数,因此使用“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\u模块('myApp.myFunc')
,并对结果调用
getattr(模块,'test')
,为函数提供一个引用,然后可以调用。

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

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\u模块('myApp.myFunc')
,并对结果调用
getattr(模块,'test')
,为函数提供一个引用,然后可以调用它。

您希望
RunAFunction(function=“test(1)”)
做什么?运行函数(function=“test(1+2)”)
怎么样?我看不出有任何方法可以避免在这里使用
eval
。您的代码是如何从字符串
test
中提取
func.test
?你怎么知道它没有引用
foo.test
?@Eric:FWIW,芹菜希望你单独指定参数,并且只使用可以在那一刻进行pickle的参数。只有模块+函数引用被指定为字符串。@Eric这是django特有的东西。RunAFunction类只是一个对象(类似于dict),其中包含“指向”我的函数的字符串。您希望
RunAFunction(function=“test(1)”)
做什么?运行函数(function=“test(1+2)”)怎么样?我看不出有任何方法可以避免在这里使用
eval
。您的代码是如何从字符串
test
中提取
func.test
?你怎么知道它没有引用
foo.test
?@Eric:FWIW,芹菜希望你单独指定参数,并且只使用可以在那一刻进行pickle的参数。只有模块+函数引用被指定为字符串。@Eric这是django特有的东西。RunAFunction类只是一个对象(类似于dict),它持有指向我的函数的字符串
class RunAFunction(models.Model):
  function = models.CharField(max_length=100)
> from myApp.models import RunAFunction
> func = RunAFunction(function="test()")
> func.save()
import importlib
modulename, funcname = string.rsplit('.', 1)

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

result = function()