2016-03-23 14 views
0

我試圖調用使用功能相同類型的類的列表的功能列表上。我想這樣做,因爲我必須遍歷幾個對象並對它們進行相同的操作,並且我有幾個不同的函數運行這樣的for循環。傳遞一個類的函數作爲參數調用它的類

有鑑於此:

def make_timeSeries(symbol): 
    return pandas.DataFrame(symbol) # Pseudo-code; But the return value is a pd.DataFrame Object nonetheless. 

Class TimeSeries: 
    def __init__(self, symbol): 
     self.series = make_timeSeries(symbol) 

    def get_y_of_day(self, day, _type): 
    # Returns a y value for a given X (date) value from a timeline. 
     if isinstance(day, str): 
      day = funcs.convert_str_to_datetime(day) 
     return self.series[(self.series['Date'] >= day) & 
          (self.series['Type'] == 
          _type)].head(1)['Value'].values[0] 

Class Market: 
    def __init__(self, symbols): 
     self.instruments = {} 
     for symbol in symbols: 
      self.instruments[symbol] = TimeSeries(make_timeSeries(symbol)) 

    def _market_day_apply_funcs(self, func, func_list=None, *args): 
    # calls a given class function of TimeSeries for each TimeSeries stored in self.instruments 
     ys = [] 
     for symbol in self.instruments: 
      ys.append(self.instruments[symbol].func(args)) 
     if func_list is None: 
      return ys 
     else: 
      return func_list(ys) 

    def market_ys_of_day(self, day, _type): 
    # Masking function, returns a list of all instruments at the given X (Date) value. 
     return self._market_day_apply_funcs(get_y_of_day, day, _type) 

我打電話它的計算方式如下:

print(market.market_ys_of_day('2016-2-1', 'vola')) 

然而這引起了NameError

Traceback (most recent call last): 
    File "/markets.py", line 73, in <module> 
    print(market.market_ys_of_day('2016-2-1', 'vola')) 
    File "/markets.py", line 38, in market_ys_of_day 
    return self._market_day_apply_funcs(get_y_of_day, day, _type) 
NameError: name 'get_y_of_day' is not defined 

我假設的方式解決這個錯誤將是通過self.instruments[symbol].func的整體,但這將失敗的目的的函數本身,這是在每個market_day_*函數中沒有重複的for循環。

任何人都知道這個解決方案嗎?

編輯 它可能感興趣地指出我的IDE凸顯func參數作爲函數的範圍不使用。如果任何人都可以解釋這一點,那麼額外的信用。

+0

Tr的y'TimeSeries.get_y_of_day' – cdarke

+0

@cdarke我相信這是行不通的,因爲該方法使用類的實例變量。我相信你首先需要創建一個TimeSeries對象並通過它。 – Luke

+0

你在哪裏實際生成'market'的實例? – roadrunner66

回答

1

到目前爲止,我所看到的:

ys.append(self.instruments[symbol].func(args)) 

應該是:

ys.append(func(args)) 

return self._market_day_apply_funcs(get_y_of_day, day, _type) 

應該是:

return self._market_day_apply_funcs(TimeSeries.get_y_of_day, day, _type) 
+0

是的,這基本上是我在我的帖子中提到的,對嗎?即通過'self.instruments [symbol] .func',而'self.instruments [symbol]'等同於您上面的'TimeSeries'。所以我必須將它作爲「func」的參數傳遞給它。 – nlsdfnbch

+1

問題在於你傳遞給方法的'func'與你在'append'中使用的'func'不一樣(這就是IDLE抱怨的原因)。 'func'參數是對特定函數的完整引用。 – cdarke

相關問題