2015-09-08 2 views
0

Я пытаюсь выполнить итерацию через OrderedDict с помощью {Key, Value}, но я запускаю Key Error. В iteritems() осуждался в Python 3.4, что я использую, и теперь я должен использовать элементы(), чтобы сделать то же самоеошибка Итерация через OrderedDict в Python 3.4

File "/home/hotdogs/mydictset.py", line 88, in __init__ 
self.mainParams[k]['start'], self.mainParams[k]['step'], self.mainParams[k] ['stop']) 
KeyError: 'timed_exit_bars' 


class MySet() 
    def __init__(self, filePath): 
    # Read diagnostics set file 
    self.content = readSetFile(filePath) 
    if not self.content: return 
    self.sections = self.content._sections 
    self.mainParams = {} 
    self.optimizationArray = {} 
    global paramIndexes 

    #for k, v in OrderedDict(self.content.items('main')).iteritems(): --was from python 2.7 and i have removed it. 

    for k, v in OrderedDict(self.content.items('main')).items(): 
     # Add the params names avoiding the optimization line 
     if k.find(",") == -1: 
      # Adding name of the param and the value 
      if k not in self.mainParams: 
       self.mainParams[k] = {} 
      self.mainParams[k]['value'] = v 
      # optimization flags 
      if self.content.has_option('main', k + ',F'): 
       if self.content.getboolean('main', k + ',F') == 1: 
        self.mainParams[k]['optimize'] = True 
        self.mainParams[k]['start'] = self.content.getfloat('main', k + ',1') 
        self.mainParams[k]['step'] = self.content.getfloat('main', k + ',2') 
        self.mainParams[k]['stop'] = self.content.getfloat('main', k + ',3') 
        self.optimizationArray[paramIndexes[k]] = (
        self.mainParams[k]['start'], self.mainParams[k]['step'], self.mainParams[k]['stop']) 
       else: 
        self.mainParams[k]['optimize'] = False 
      else: 
       self.mainParams[k]['optimize'] = False 

    i = 0 

При попытке отладки ключа ошибки. я вижу, что mainParams содержит только обычный unsorted dict, и сами параметры также обычны сами по себе из отладки ниже. Пример ниже

{'section_1': {'value': '################# General Settings #################', 'optimize': False}, 
    'run_every_tick': {'value': '0', 'optimize': False}, 
    'historic_data_id': {'value': '1', 'optimize': False}, 
    'section_2': {'value': '############## Common Strategy Settings ##############','optimize': False}, 
    'use_instance_balance': {'value': '0', 'optimize': False}, 
    'comments': {'value': 'Click Modify expert to view comments inside the source code.', 'optimize': False}, 
    'operational_mode': {'value': '1', 'optimize': False}, 
    'instance_management': {'value': '0', 'optimize': False}, 
    'analysis_window_size': {'value': '0', 'optimize': False}, 
    'enable_screenshots': {'value': '0', 'optimize': False}, 
    'timed_exit_bars': {'step': 5.0, 'start': 5.0, 'value': '60', 'stop': 100.0, 'optimize': True}, 
    'max_open_orders': {'value': '1', 'optimize': False}, 
    'strategy_timeframe': {'value': '60', 'optimize': False}, 
    'ui_font_size': {'value': '12', 'optimize': False}, 
    'disable_compounding': {'value': '1', 'optimize': False}} 

Ниже приведен пример того, что я получаю через Debug для ParamIndexes

{ 
'INTERNAL_STRATEGY_ID': 52, 
'RUN_EVERY_TICK': 43, 
'MAX_OPEN_ORDERS': 45, 
'OPERATIONAL_MODE': 50, 
'ANALYSIS_WINDOW_SIZE': 55, 
'TIMEFRAME': 53, 
'DISABLE_COMPOUNDING': 47, 
'INSTANCE_MANAGEMENT': 44, 
'MAX_SPREAD': 59, 
'TIMED_EXIT_BARS': 48, 
'STRATEGY_INSTANCE_ID': 51, 
... 
... 
.... 
.... 
.... 
.... 
.... 
.... 
.... 
.... 
} 

Есть ли что-то я отсутствует. Кажется, я не могу заставить его работать с элементами() для итерации через словарь. Любая помощь приветствуется.

+1

Каково значение 'paramIndexes'? может быть, что это ошибка с ключом – lemonhead

+0

'для k, v в OrderedDict (self.content.items ('main')). ​​items()' - вызов OrderedDict на регулярном dict не собирается возвращаться в прошлое и получить информацию о заказе, которую вы никогда не отслеживали, а вызов OrderedDict на OrderedDict является бессмысленным, если вам не нужна копия. – user2357112

ответ

0

Проблема заключается в этой строке:

self.optimizationArray[paramIndexes[k]] = (
self.mainParams[k]['start'], self.mainParams[k]['step'], self.mainParams[k]['stop']) 

Так как вы только что создали self.mainParams[k]['start'], self.mainParams[k]['step'] и self.mainParams[k]['stop'], тем не поднимая ошибку. Единственный виновник осталось paramIndexes[k] и/или self.optimizationArray[paramIndexes[k]]

Я удвоит чек, которыйparamIndexesимеетkи чтоself.optimizationArrayимеет независимо paramIndexes[k] карты в.

Эта проблема не имеет отношения к OrderedDict. Это просто KeyError.

Смежные вопросы