2017-04-19 28 views
0

我试图实现这个:https://stackoverflow.com/a/12025554/7718153 为matplotlib,但出了问题。如何在python中用getattr调用函数?

import matplotlib.pyplot as plt 

if condition1: 
    q='plot' 
elif condition2: 
    q='logy' 
elif condition3 
    q='loglog' 

m = globals()['plt']() 
TypeError: 'module' object is not callable 

plot_function = getattr(m, q) #it doens't make it to this line 

我希望它这样做:

if condition1: 
    plt.plot(...) 
elif condition2: 
    plt.logy(...) 
elif condition3: 
    plt.loglog(...) 

有谁知道我做错了什么?

编辑:我很抱歉,我的代码错误顺序。现在已经修复了。

EDIT2:

这是它origionally来自代码:

def plot(self): 
    assert self.plotgraph == True 
    plt.figure(1) 
    plt.rcParams.update({'font.size': 40}) 
    plt.figure(figsize=(150, 70)) 
    plt.suptitle('alpha = '+str("{0:.2f}".format(self.alpha))) 


    j=len(self.seeds) 
    for k in range(9*j): 
     plt.subplot(3,3*j,k+1) 
     g=k%(3*j) 
     if k<3*j: 
      q='plot' 
     elif 3*j<=k<6*j: 
      q='logy' 
     elif 6*j<=k: 
      q='loglog' 
     m = globals()['plt']() 
     plot_function = getattr(m, q) 
     if g<2*j: 
      for i in range(j): 
       if (2*i)<=g%j*2<(2*(i+1)): 
        seed_type=' seed: '+ str(i+1) 
        seed=(i+1) 
     else: 
      for i in range(j): 
       if g%j == i: 
        seed_type=' seed: '+ str(i+1) 
        seed=(i+1) 

     if g<2*j: 
      if g%2==0: 
       set_type=' train-set' 
       plot_function(np.array(self.index),np.array(self.plotlist[seed*2+0])) 
      else: 
       set_type=' test-set' 
       plot_function(np.array(self.index),np.array(self.plotlist[seed*2+1])) 
     else: 
      set_type=' train-test dist' 
      plot_function(np.array(self.index),np.array(self.plotlist[seed*2+0]-np.array(self.plotlist[seed*2+1]))) 

     plt.grid(True) 
     plt.title(q+set_type+seed_type) 
    plt.tight_layout() 
    plt.savefig("plot1() " +str(self.nodes[1])+' hidden nodes, alpha='+ str("{0:.2f}".format(self.alpha)) + '.png') 
    plt.clf() 
    plt.close() 

回答

2

m = globals()['plt']()是一回事plt()plt是一个模块,因此不可调用。我认为你想要:

m = globals()['plt'] 
plot_function = getattr(m, q) 
plot_function() # call this one! 

这样说...这种设计似乎不必要的复杂。为什么不是:

if condition1: 
    plt.plot() 
elif condition2: 
    plt.logy() 
elif condition3: 
    ... 
+0

当我尝试定义m时会引发错误。 它是一个更大的循环的一部分。我会更新我的原创帖子。 –

+0

它的工作原理!感谢你及时的答复。 –