str对象不可调用 - 使用函数/字符串作为参数调用函数

时间:2016-07-29 17:43:51

标签: python python-2.7

执行此代码时:

clffunc = sys.argv[1]    

def fun(clffunc):
      error_vector = clffunc()
      print error_vector
      loss_total = sum(error_vector)
      loss_mean = np.mean(error_vector)
      print "The mean error is %.2f" % loss_mean

def svm_clf():
      #The clasificator object 
      clf = svm.SVC()
      clf.fit(train_features, train_targets)
      # Prediction
      test_predicted = clf.predict(test_features)
      # Analysis and output 
      return np.absolute(test_predicted-test_targets)

if __name__ == "__main__":
      fun(clffunc)
来自终端的

python GraspT.py svm_clf

我收到以下错误:

 File "/home/iki/griper validating/GraspT.py", line 24, in fun
    error_vector = clffunc()

TypeError: 'str' object is not callable

在互联网上,我无法找到解决方案。 ' STR'当某人重新定义内置函数或类似函数时,几乎总是可以调用object。这不是我的情况。这里我从终端传递一个字符串,然后在函数参数中用作字符串。这个论点实际上是一个函数。所以我想选择将在代码中执行的函数(机器学习中的分类器方法)。

4 个答案:

答案 0 :(得分:1)

svm_clf是一个字符串,而不是一个函数对象。该字符串的内容可能与函数名称匹配,但这并不能使其成为函数。

您可以使用字典将有效名称映射到函数:

functions = {'svm_clf': svm_clf}

if __name__ == "__main__":
    fun(function[clffunc])

或者您可以使用globals()为此目的返回的字典:

if __name__ == "__main__":
    fun(globals()[clffunc])

这在命令行工具中可能没问题,但考虑到这允许该工具的用户使您的脚本调用具有全局名称的任何内容。

答案 1 :(得分:0)

您可以通过函数名称直接访问globals和索引。

def some_func():
    print 'called some_func!'

def some_other_func():
    print 'called some_other_func!'

globals()['some_func']()
globals()['some_other_func']()

globals()[sys.argv[1]]()

另外,您可以考虑使用eval

答案 2 :(得分:0)

import sys

def foo(): sys.stdout.write("foo called\n")
def foo1(): sys.stdout.write("foo1 called\n")

if __name__ == "__main__":
    if len(sys.argv) < 2:            # prevent IndexError
        sys.stdout.write("Use commandline argument: foo or foo1\n")
        sys.exit()                   # Print --help and exit
    name = sys.argv[1]               # Get name (str is)
    m = sys.modules["__main__"]      # Get main module instance obj
    if hasattr(m, name):             # Check attribute exists
        a = getattr(m, name)         # Get attribute by str-name
        if hasattr(a, '__call__'):   # Verify callable is?
            a()                      # Call
        else:
            sys.stderr.write("ERROR: is not some callable '%s'\n" % name)
            sys.exit(1)
    else:
        sys.stderr.write("ERROR: has no attr named '%s'\n" % name)
        sys.exit(1)

答案 3 :(得分:0)

问题是你没有正确理解你想要完成的事情。

clffunc = sys.argv[1]    

def fun(clffunc):
      error_vector = clffunc()

您正在尝试调用字符串。 sys.argv[1]以字符串形式返回第二个参数。你这样做:"svm_clf"()。简单的解决方案是使用eval buildin函数。例如:eval('%s()' % clffunc)。这个表达肯定会起作用:)。

应使其有效的更正:

if __name__ == "__main__":
  fun(eval(clffunc))