代码之家  ›  专栏  ›  技术社区  ›  schneck

python函数指针

  •  65
  • schneck  · 技术社区  · 16 年前

    我在这样的变量中存储了一个函数名:

    myvar = 'mypackage.mymodule.myfunction'
    

    现在我想这样调用我的函数

    myvar(parameter1, parameter2)
    

    最简单的方法是什么?

    8 回复  |  直到 10 年前
        1
  •  95
  •   Ignacio Vazquez-Abrams    16 年前
    funcdict = {
      'mypackage.mymodule.myfunction': mypackage.mymodule.myfunction,
        ....
    }
    
    funcdict[myvar](parameter1, parameter2)
    
        2
  •  35
  •   user609095    16 年前

    只存储函数本身就更好了,因为它们是Python中的一流对象。

    import mypackage
    
    myfunc = mypackage.mymodule.myfunction
    myfunc(parameter1, parameter2)
    

    但是,如果必须动态导入包,则可以通过以下方式实现:

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

    然而,请记住,所有这些工作都适用于您当前所处的任何范围。如果你不以某种方式坚持它们,那么如果你离开本地范围,你就不能指望它们会留下来。

        3
  •  12
  •   Pratik Deoghare    16 年前
    def f(a,b):
        return a+b
    
    xx = 'f'
    print eval('%s(%s,%s)'%(xx,2,3))
    

    输出

     5
    
        4
  •  8
  •   S.Lott    16 年前

    最容易的

    eval(myvar)(parameter1, parameter2)
    

    您没有函数“指针”。您有一个函数“name”。

    虽然这很有效,但是会有很多人告诉您这是“不安全”或“安全风险”。

        5
  •  5
  •   ironfroggy    16 年前

    为什么不存储函数本身呢? myvar = mypackage.mymodule.myfunction 更干净。

        6
  •  4
  •   Matt Anderson    16 年前
    modname, funcname = myvar.rsplit('.', 1)
    getattr(sys.modules[modname], funcname)(parameter1, parameter2)
    
        7
  •  2
  •   SilverbackNet    12 年前

    eval(compile(myvar,'<str>','eval'))(myargs)

    compile(…,'eval')只允许使用一条语句,这样在调用后就不会有任意命令,否则会出现语法错误。然后,一点点验证至少可以将表达式限制在您的能力范围内,比如开始测试“mypackage”。

        8
  •  2
  •   Rob Fagen Fredrik Pihl    10 年前

    我在创建用于处理身份验证的库时遇到了类似的问题。我希望使用我的库的应用程序所有者能够在库中注册回调,以便根据认证人员所在的LDAP组检查授权。配置将作为一个config.py文件传入,该文件将被导入并包含一个包含所有配置参数的dict。

    我要用这个:

    >>> class MyClass(object):
    ...     def target_func(self):
    ...         print "made it!"
    ...    
    ...     def __init__(self,config):
    ...         self.config = config
    ...         self.config['funcname'] = getattr(self,self.config['funcname'])
    ...         self.config['funcname']()
    ... 
    >>> instance = MyClass({'funcname':'target_func'})
    made it!
    

    有没有做这个的方法?

    推荐文章