【问题标题】:Python: Substitute variable values before passing to another functionPython:在传递给另一个函数之前替换变量值
【发布时间】:2015-11-29 08:04:53
【问题描述】:

我想确定输入字符串是否是有效的函数名。 有什么方法可以在传递给 isfunction 调用之前替换变量的值?

#!/usr/bin/python
def testFunc():
    print "Hello world!";
    return;

myString = "testFunc";
isfunction(testFunc); // This returns **True**
isfunction(myString); // This returns **False**

【问题讨论】:

  • 你的意思是string是一个合法的函数名,还是variable是一个函数?
  • @khelwood:我想知道 myString 中存在的值是否有效
  • @Ashwin 那么当myString"testFunc" 时为什么isfunction(myString) 应该返回false?

标签: python string variable-substitution


【解决方案1】:

一种方法是使用eval,它将字符串解释为代码:

try:
    eval(myString)
except NameError:
    # not a function

【讨论】:

  • 这将执行字符串包含的任何代码,并可能导致比 NameError 可以捕获的错误更多。
【解决方案2】:

假设您想检查是否存在已加载的函数,您可以试试这个:

try:
    if hasattr(myString, '__call__'):
        func = myString
    elif myString in dir(__builtins__):
        func = eval(myString)
    else:
        func = globals()[myString]

except KeyError:
    #this is the fail condition

# you can use func()

如果你总是保证 myString 实际上是一个字符串而不是一个函数对象,那么第一个if 实际上是不必要的,我只是为了安全而添加它。

无论如何,如果您真的打算执行这些功能,我会谨慎行事。执行任意功能可能是有风险的业务。

编辑:

我添加了另一行以更加确定我们实际上不会执行代码,除非我们愿意。也改了,让它更整洁一些

【讨论】:

  • hasattr 返回 False,因为它将 myString 视为字符串变量
  • 你是对的。这就是存在其他条件的原因。
猜你喜欢
  • 2014-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多