在python中传递函数引用

时间:2014-10-15 23:54:10

标签: python

好的,所以我看到一些奇怪的东西,我想我误解了如何在python中传递函数..

class Foo:
  def execute(self, **kwargs):
    print "self is ", self # <foo.Foo object at 0x1012948d0>
    features = {func_name: feature_func(kwargs, arg=arg)for func_name, 
                              feature_func in Foo.ALGORITHMS.items()}

  def func1(self, **kwargs):
     print "self is " , self # prints {}
     self._funchelp()

  def __funchelp(self):
     # pass


  ALGORITHMS = {'func1': func1}

所以,我没有得到的是为什么自我打印是一个空字典?

features = {func_name: feature_func(kwargs, arg=arg)for func_name, 
                              feature_func in Foo.ALGORITHMS.items()}

上面有些东西搞砸了

然后

self._funchelp() 返回AttributeError: 'dict' object has no attribute '_Foo__funchelp'

1 个答案:

答案 0 :(得分:1)

这可能是因为你需要在你的词典理解中包含self作为feature_func的第一个参数。此外,您需要将**放在kwargs前面。您可能还需要在kwargs上设置'arg'键,如下所示,以避免某种参数错误。虽然不确定:

kwargs['arg'] = 123
features = {func_name: feature_func(self, **kwargs) for func_name, 
                          feature_func in Foo.ALGORITHMS.items()}

奇怪的错误可能是因为您尝试访问_funchelp作为空dict对象的属性。此外,您的函数被定义为__funchelp,带有两个下划线,由于它在内部处理双下划线属性的方式,它可以通过python获得mangled。我认为_funchelp必须是一个拼写错误,因为我不认为如果你的代码真的存在,那就不会破坏这个名字。