Python函数指针

sch*_*eck 69 python function-pointers

我有一个函数名存储在一个变量中,如下所示:

myvar = 'mypackage.mymodule.myfunction'
Run Code Online (Sandbox Code Playgroud)

而我现在想要像这样打电话给我

myvar(parameter1, parameter2)
Run Code Online (Sandbox Code Playgroud)

实现这一目标的最简单方法是什么?

Ign*_*ams 101

funcdict = {
  'mypackage.mymodule.myfunction': mypackage.mymodule.myfunction,
    ....
}

funcdict[myvar](parameter1, parameter2)
Run Code Online (Sandbox Code Playgroud)

  • 引用已经解决,因此只有dict中的查找才会占用调用本地函数之外的任何时间.甚至可以通过只查看一次来减轻这种情况. (5认同)

小智 37

能够只存储函数本身要好得多,因为它们是python中的第一类对象.

import mypackage

myfunc = mypackage.mymodule.myfunction
myfunc(parameter1, parameter2)
Run Code Online (Sandbox Code Playgroud)

但是,如果您必须动态导入包,那么您可以通过以下方式实现此目的:

mypackage = __import__('mypackage')
mymodule = getattr(mypackage, 'mymodule')
myfunction = getattr(mymodule, 'myfunction')

myfunction(parameter1, parameter2)
Run Code Online (Sandbox Code Playgroud)

但请记住,所有这些工作都适用于您目前所处的任何范围.如果您不以某种方式坚持它们,如果您离开当地范围,您就不能指望它们留在那里.


Pra*_*are 13

def f(a,b):
    return a+b

xx = 'f'
print eval('%s(%s,%s)'%(xx,2,3))
Run Code Online (Sandbox Code Playgroud)

OUTPUT

 5
Run Code Online (Sandbox Code Playgroud)

  • @zanlok是的!:-)然后我不知道. (5认同)
  • eval是魔鬼,imo (4认同)

S.L*_*ott 8

最简单的

eval(myvar)(parameter1, parameter2)
Run Code Online (Sandbox Code Playgroud)

你没有函数"指针".你有一个功能"名称".

虽然这很好用,但是你会有很多人告诉你它"不安全"或"安全风险".

  • ......那些大量的人都是对的. (7认同)
  • @schneck,我不明白你的意思"因为它是一个通用的应用程序"可能在这里意味着.如果您已将其定义为字符串文字,那么您已经足够了解它并不需要这样做. (6认同)
  • “不安全”:如果 myvar 来自用户输入,是的 :) (2认同)
  • @schneck:如果eval('string')没有产生正确的函数,那么你的问题就不完整了.你遗漏了一些至关重要的东西.您可以尝试发布*确实*的内容以及不起作用的详细错误消息. (2认同)
  • @Derrick Turn,@ Trtytych:只有当这个字符串来自一个恶意的反社会人士时,他们才是正确的.来自互联网上未经身份验证的人的用户输入可能涉及恶意反社会.大多数其他所有内容通常都不涉及恶意的反社会人员,将安全风险降低到与删除应用程序的所有源代码的人完全相同的风险. (2认同)

iro*_*ggy 5

为什么不存储功能本身?myvar = mypackage.mymodule.myfunction更清洁.