Python 如何调用名称存储在变量中的方法
在下面的代码中,如何使unicode数据可调用。我得到的错误是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
//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()