字典没有选择正确的键

2024-10-01 02:37:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我的一本字典有个奇怪的问题。你知道吗

下面是一个方法,它将根据接收到的时间帧执行另一个方法。时间框架为m1、m5、m15、m30、H1、H4、D1、W1、m1。你知道吗

基本上从1分钟到1个月。你知道吗

def get_trading_range(self, init_date, time_frame):
    """
    """
    key = time_frame[:1]
    tr_dict = {
        'D' : self._daily_range(init_date),
        'W' : self._weekly_range(init_date),
        'M' : self._monthly_range(init_date),
        'H' : self._hourly_range(init_date, time_frame),
        'm' : self._minutely_range(init_date, time_frame)
    }
    return tr_dict[key]

方法的调用方式如下

DateRange().get_trading_range(datetime(some_date), 'D1')

它似乎在选择“m”方法。我尝试删除'm'键和值,然后再次执行时,它选择'H'方法。只有同时删除“m”和“H”键和值时,才会执行“D”方法。你知道吗

这是什么奇怪的虫子吗?你知道吗

这是回溯

Traceback (most recent call last):
  File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
    self.run()
  File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run
    self._target(*self._args, **self._kwargs)
  File "engine.py", line 25, in _historical
    HistoricalCollector().historical_prices(hist_queue, live_queue, event)
  File "/home/nonroot/fxcmminer_1.1/fxcm/historical.py", line 90, in historical_prices
    self._historical_iter(hist_queue, live_queue, fxoffer)
  File "/home/nonroot/fxcmminer_1.1/fxcm/historical.py", line 73, in _historical_iter
    self._collect_data(fxc, offer, time_frame, init_date)
  File "/home/nonroot/fxcmminer_1.1/fxcm/historical.py", line 28, in _collect_data
    dtx = DateRange().get_trading_range(init_date, time_frame)
  File "/home/nonroot/fxcmminer_1.1/fxcm/tradinghours.py", line 84, in get_trading_range
    'm' : self._minutely_range(init_date, time_frame),
  File "/home/nonroot/fxcmminer_1.1/fxcm/tradinghours.py", line 103, in _minutely_range
    freq = self._data_frequency(time_frame)[0]
  File "/home/nonroot/fxcmminer_1.1/fxcm/tradinghours.py", line 23, in _data_frequency
    return freq_keys[time_frame]
KeyError: 'D1'

也尝试了key = time_frame[0]

Traceback (most recent call last):
  File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
    self.run()
  File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run
    self._target(*self._args, **self._kwargs)
  File "engine.py", line 25, in _historical
    HistoricalCollector().historical_prices(hist_queue, live_queue, event)
  File "/home/nonroot/fxcmminer_1.1/fxcm/historical.py", line 90, in historical_prices
    self._historical_iter(hist_queue, live_queue, fxoffer)
  File "/home/nonroot/fxcmminer_1.1/fxcm/historical.py", line 73, in _historical_iter
    self._collect_data(fxc, offer, time_frame, init_date)
  File "/home/nonroot/fxcmminer_1.1/fxcm/historical.py", line 28, in _collect_data
    dtx = DateRange().get_trading_range(init_date, str(time_frame))
  File "/home/nonroot/fxcmminer_1.1/fxcm/tradinghours.py", line 84, in get_trading_range
    'm' : self._minutely_range(init_date, time_frame),
  File "/home/nonroot/fxcmminer_1.1/fxcm/tradinghours.py", line 103, in _minutely_range
    freq = self._data_frequency(time_frame)[0]
  File "/home/nonroot/fxcmminer_1.1/fxcm/tradinghours.py", line 23, in _data_frequency
    return freq_keys[time_frame]
KeyError: 'D1'

Tags: inpyselfhomedatetimeinitline
2条回答

问题是这些方法在创建tr_dict时被调用,而不是在您访问它时被调用,这就是为什么您的_minutely_rangetime_frame = "D1"调用的原因。你知道吗

尝试以下操作:

tr_dict = {
    'D' : lambda: self._daily_range(init_date),
    'W' : lambda: self._weekly_range(init_date),
    'M' : lambda: self._monthly_range(init_date),
    'H' : lambda: self._hourly_range(init_date, time_frame),
    'm' : lambda: self._minutely_range(init_date, time_frame)
}
return tr_dict[key]()

这样,只有在必要时才会调用这些方法。你知道吗

看起来函数没有返回'm'或'H',但是在回溯时正在计算它们。是key而不是time_frame传递给它们的函数吗?你知道吗

相关问题 更多 >