执行此代码时:
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。这不是我的情况。这里我从终端传递一个字符串,然后在函数参数中用作字符串。这个论点实际上是一个函数。所以我想选择将在代码中执行的函数(机器学习中的分类器方法)。
答案 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))