我有以下代码
str = "Hello , World"
FunctionToCall = str.split(",")[0]
def Hello():
print "succes"
我如何才能获得这样的效果?我试过了:
FunctionToCall = str.split(",")[0]()
但这会返回以下错误:
TypeError: 'str' object is not callable
答案 0 :(得分:1)
好的,我假设您确实在尝试执行以下操作:
Hello
的函数。 首先,您不应该使用“str”作为变量名称,因为它会隐藏built-in function。 (你的版本实际上会在你的情况下工作,但这是个坏主意。)
strng = "Hello , world" #note new name
其次,你可以更好地解析你的字符串:它现在在“Hello”之后有一个空格。您可以使用string.strip
执行此操作。 (同样,您的版本适用于大多数情况,但额外的strip
更清晰。)
functionToCall = strng.split(",")[0].strip()
但最重要的是,您需要根据给定的名称调用该函数。有许多方法可以做到这一点,具有不同程度的安全性。最简单的方法是使用eval
函数:
eval(functionToCall)()
[您也可以使用eval(functionToCall + '()')
。]
但eval
通常被认为是危险的,因为它可以执行任意代码。在这里,您可以利用在全局命名空间中定义Hello
函数的事实,因此在globals()
字典中有一个条目。这是你关心的实际功能:
globals()[functionToCall]()
答案 1 :(得分:-1)
由于我被投票,我可能并不完全明白OP想要做什么。所以我想出了一个全新的答案。
如果要调用与某个地方的字符串同名的函数,可以尝试执行以下操作:
def Hello():
print "Success!"
def default():
print "No such function!"
# create a dictionary with the names and corresponding functions
d = {"Hello": Hello}
s = "Hello , World!"
# check if the string you extract with s.split() is a function by
# looking in the dictionary; this will print "Success" if "Hello"
# is in the dictionary and "No such function" if it's not
FunctionToCall = d.get(s.split(",")[0].strip(), default)()
# output: Success!
此方法应比使用eval()
评估字符串更安全。