2015-04-22 3 views
-1

Я пытаюсь передать dictionnary функции, которая будет «анализировать» ее, но я не могу ее перебирать, она выглядит просто, но не может понять, что происходит.Невозможно перебрать словарь python

Моя функция:

def _build_options(self, options): 
     print options 
     for option, value in options.iteritems(): 
      if option not in self._optionslist: 
       del options[option] 
     return options 

Варианты:

{'segment_container': None, 'use_slo': False, 'log_level': 'INFO', 
'dir_marker': 'False', 'changed': None, 'leave_segments': False, 'fail_fast': 
False, 'headers': 'X-Delete-After:50, X-Upload:None', 'meta': [], 
'ttl': None, 'segment_size': None, 'skip_identical': False} 

Мой код поднимает это:

AttributeError: Values instance has no attribute 'iteritems' 

Благодаря

редактировать: тип (опции):

<type 'instance'> 

реж (опция):

['__cmp__', '__doc__', '__init__', '__module__', '__repr__', '__str__', 
'_update', '_update_careful', '_update_loose', 'changed', 'dir_marker', 
'ensure_value', 'fail_fast', 'headers', 'leave_segments', 'log_level', 'meta', 'read_file', 'read_module', 
'segment_container', 'segment_size', 'skip_identical', 'ttl', 'use_slo'] 

я попытался опции = Dict (варианты), но я получаю ошибку:

TypeError: iteration over non-sequence 

edit2: У меня есть загрузки() метод в котором я называю _build_options():

def upload(self, paths, ttl, options): 
    # [...] 
    # print options, type(options) 
    # the dictionnary is well printed but its type is "instance" 
    opts = self._build_options(options) 

загрузки() вызывается в другой файл, как это:

self.swift_mng.upload(filename, None, options) 

и я получаю варианты от optparse.parse_args()

+6

у вас есть экземпляр Value а не Dict, что такое стоимость? –

+1

check type (options) – itzMEonTV

+0

Также проверьте 'dir (options)', чтобы увидеть доступные методы. – cdarke

ответ

0

Прежде всего, вы не используете словарь, он просто выглядит, что при печати (это __str__ метод в классе, чтобы он выглядел так).

Прочитано documentation для optparse, а также this.

options - объект, содержащий значения для ваших опций. Насколько я могу судить, вы не можете перебирать опции (в классе нет __iter__), вы можете тестировать только отдельные значения параметров.

EDIT: Тем не менее, я нашел это, что может быть полезно: http://code.activestate.com/lists/python-list/344094/

+0

Это очень помогло мне, спасибо! – val

2

Не уверен, что ошибка атрибута. Но вы не можете изменить размер словаря, когда вы зацикливаете на нем. Как уже упоминалось в комментариях вы можете проверить тип вариантов, и сделать некоторые вещи, как это:

def _build_options(self, options): 
    if type(options) == dict: 
     for option in self._optionslist: 
      if option in options: 
       del options[option] 
     return options 
+1

isinstance является правильным способ проверить, has_key не должен использоваться и не существует в python3, и это также не отвечает на вопрос. –

+0

Теперь он хорошо работает благодаря вам!Но я не понимаю, почему это устранило мою проблему. Изменить: на самом деле это не – val

+0

вы также можете разместить вызывающую часть. Я имею в виду, когда вы называете этот метод. Там должна быть какая-то проблема, так как эта часть кажется прекрасной. – shaktimaan

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