从字符串调用函数

时间:2014-10-08 11:34:28

标签: python-2.7

我有以下代码

str = "Hello , World"

FunctionToCall = str.split(",")[0]

def Hello():
    print "succes"

我如何才能获得这样的效果?我试过了:

FunctionToCall = str.split(",")[0]()

但这会返回以下错误:

TypeError: 'str' object is not callable

2 个答案:

答案 0 :(得分:1)

好的,我假设您确实在尝试执行以下操作:

  1. 解析字符串'Hello,world'并获取第一个条目'Hello'
  2. 基于此,调用名为Hello的函数。
  3. 首先,您不应该使用“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()评估字符串更安全。