在下面的代码中,如何使unicode数据可调用。我得到的错误是//TypeError: 'unicode' object is not callable
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')
答案 0 :(得分:3)
如果我理解,你要做的是找到名称由i.header
变量引用的函数,然后调用它。 (标题令人困惑,它会让您想要使实际的unicode
实例可调用。)
这可以使用globals()
:
func = globals()[i.header]
print func # found it
func() # call it
答案 1 :(得分:3)
使用字符串创建要调用的函数的dict:
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
使用class:
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)
答案 2 :(得分:2)
这是使用装饰器的好方法
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()
这样很明显函数是否是标题处理程序