【问题标题】:Passing a function of a class as argument to call it on a list of classes将类的函数作为参数传递以在类列表中调用它
【发布时间】:2016-03-23 08:04:05
【问题描述】:

我正在尝试使用函数调用相同类型的类列表中的函数。我想要这个,因为我必须循环多个对象并对每个对象执行相同的操作,并且我有几个不同的函数运行这样的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,但这会破坏函数本身的目的,即每个 @987654328 中没有重复的 for 循环@ 功能。

有人知道解决办法吗?

编辑 声明我的 IDe 突出显示函数范围内未使用的 func 参数可能会很有趣。如果有人也能解释这一点,那就加分。

【问题讨论】:

  • 试试TimeSeries.get_y_of_day
  • @cdarke 我相信这行不通,因为该方法使用类的实例变量。我相信您首先需要创建一个 TimeSeries 对象并传递它。
  • 您在哪里实际生成market 的实例?
  • 是的,它没有 - 仍然是 NameError
  • 在我的主循环中,market = Market(symbols).

标签: python function parameter-passing


【解决方案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)

【讨论】:

  • 是的,这基本上是我在帖子中的建议,对吗?即通过self.instruments[symbol].funcself.instruments[symbol] 相当于你上面的TimeSeries。所以我必须将实例与它一起作为func 工作的参数传递。
  • 问题是您传递给方法的func 与您在append 中使用的func 不同(这就是IDLE 抱怨的原因)。 func 参数是对特定函数的完整引用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-08
  • 2017-05-20
相关资源
最近更新 更多