簡體   English   中英

傳遞類的函數作為參數以在類列表上調用它

[英]Passing a function of a class as argument to call it on a list of classes

我正在嘗試使用一個函數來調用相同類型的類列表。 我想要這個,因為我必須遍歷幾個對象並對每個對象執行相同的操作,並且我有幾個不同的函數正在運行這樣的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 ,但這將self.instruments[symbol].func函數本身的目的,即在每個market_day_*中都沒有重復的for循環。功能。

有人知道解決方案嗎?

編輯可能有必要指出,我的IDe突出顯示了func范圍中未使用的func參數。 如果有人也可以解釋這一點,則可以給予額外的榮譽。

據我所知:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM