关于python:如何调用名称存储在变量中的方法

How to call a method whose name is stored in a variable

本问题已经有最佳答案,请猛点这里访问。

在下面的代码中,如何使unicode数据可调用。我得到的错误是//TypeError: 'unicode' object is not callable

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 def test(test_config):
    for i in test_config:
      print i.header //prints func1
      print type(i.header) // prints unicode
      try:
        #i.header()//TypeError: 'unicode' object is not callable
        func = globals()[i.header]
        print func  # found it
        func()
      except AttributeError:
        logging.error("Method  %s not implemented"%(i.header))

  def func1():
      print"In func1"

 test(u'func1')


使用字符串创建要调用的函数的dict:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def test(test_config):
    for i in test_config:
      print i.header //prints func1
      print type(i.header)
      try:
        methods[i.header]()
      except (AtributeError, TypeError):
        logging.error("Method  %s not implemented"%(i.header))

def func1():
    print"In func1"
def func2():
    print"In func2"

methods = {u'func1':func1, u'func2':func2} #Methods that you want to call

使用类:

1
2
3
4
5
6
7
8
9
10
11
class A:
    def test(self, test_config):
        try:
          getattr(self, i.header)()
        except AtributeError:
           logging.error("Method  %s not implemented"%(i.header))

    def func1(self):
        print"In func1"
x = A()
x.test(pass_something_here)


如果我理解,您要做的就是找到一个函数,它的名称被i.header变量引用,然后调用它。(标题很混乱,它让人觉得您想让实际的unicode实例可调用)。

这可以使用globals()来完成:

1
2
3
func = globals()[i.header]
print func  # found it
func()  # call it


这是一个使用装饰的好方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
header_handlers = {}

def header_handler(f):
    header_handlers[f.__name__] = f
    return f

def main():
    header_name ="func1"
    header_handlers[header_name]()

@header_handler
def func1():
    print"func1"

@header_handler
def func2():
    print"func2"

@header_handler
def func3():
    print"func3"

if __name__ =="__main__":
    main()

这样,很明显函数是否是头处理程序