Python 如何调用名称存储在变量中的方法

Python 如何调用名称存储在变量中的方法,python,function-call,Python,Function Call,在下面的代码中,如何使unicode数据可调用。我得到的错误是//TypeError:“unicode”对象不可调用 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

在下面的代码中,如何使unicode数据可调用。我得到的错误是
//TypeError:“unicode”对象不可调用

 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')      

如果我理解的话,您要做的是找到其名称被
I.header
变量引用的函数,然后调用它。(标题令人困惑,它给人的印象是您想要使实际的
unicode
实例可调用)

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


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

def test(test_config):
    for i in test_config:
      print i.header //prints func1
      print type(i.header)
      try:
        methods[i.header]()
      except (AttributeError, 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
使用类:

class A:
    def test(self, test_config):
        try:
          getattr(self, i.header)()
        except AttributeError:
           logging.error("Method  %s not implemented"%(i.header)) 

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

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

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()

通过这种方式,很明显函数是否是标头处理程序

您是否试图调用名称由
i.header
变量引用的方法?请查看更新的问题,您希望它在调用时做什么?您是否希望
“print”('Hello World')
工作?如果是,它在python中不是这样工作的。如果想法是
i.header
包含函数名,那么类似这样的内容是使其工作的最佳方式。但这不是最好的主意——将函数名作为数据传递并不是完全安全的。如果您可以找到不同的设计,例如直接传递函数对象,那就更好了。func=globals()[i.header]keyrorm:u'func1'这意味着名称
func1
没有在您试图访问它的位置定义。你可以发布一个完整的例子来说明如何得到这个错误吗?不,我已经定义了func1。请查看更新的问题。很抱歉,你的代码仍然不完整。请发布您的完整示例,包括调用
test
和错误消息,包括回溯。是否有其他方法不使用字典?+1显式dict应优先于查找globals()。你不想意外发现某人有一个名为“test”的头。@Rajeev使用一个类,然后你可以使用
getattr
调用这些方法。你能给我看一下snippet@Rajeev我添加了一个示例。
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()