словарь python из синтаксического анализатора конфигурации, если значение и %( в значении: аргумент типа 'int' не является итерируемым

Получение этой ошибки как случайной, иногда появляется, иногда нет:

for i in range(1,32):
    sezione = "GRP"+str(i)
    dizionarioGRP = dict(config.items(sezione))
    print int(dizionarioGRP['r'])

и это ошибка

  File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
    self.run()
  File "/home/pi/gigi.py", line 436, in run
    self.esegui()
  File "/home/pi/gigi.py", line 307, in esegui
    L.gruppo(idgruppo)
  File "/home/pi/gigi1.py", line 282, in gruppo
    dizionarioGRP = dict(config.items(sezione))
  File "/usr/lib/python2.7/ConfigParser.py", line 655, in items
    for option in options]
  File "/usr/lib/python2.7/ConfigParser.py", line 663, in _interpolate
    if value and "%(" in value:
TypeError: argument of type 'int' is not iterable

почему он называется int, если я преобразовал его в строку?


person user2239318    schedule 31.01.2014    source источник
comment
да, вы вставляете неправильные строки кода, проверьте номер строки и вставьте, пожалуйста.   -  person James    schedule 31.01.2014
comment
не могли бы вы вставить свой конфиг.   -  person James    schedule 31.01.2014


Ответы (1)


Где-то в вашем коде вы делаете это:

config.set('something', 'something', 0) # or some integer

Или, при желании, вы передаете нестроковое значение в свой конструктор ConfigParser dict.

Это тонко противоречит тому, что говорят документы:

Если данный раздел существует, установите данную опцию в указанное значение; в противном случае вызовите NoSectionError. Хотя можно использовать RawConfigParser (или ConfigParser с необработанными параметрами, установленными в true) для внутреннего хранения нестроковых значений, полная функциональность (включая интерполяцию и вывод в файлы) может быть достигнута только при использовании строковых значений.

Поэтому всякий раз, когда вы вызываете ConfigParser.set, убедитесь, что вы переносите то, что вы устанавливаете, в str. В противном случае он выдает ошибку при просмотре всех значений в _interpolate. (Я считаю некоторую часть этого поведения ошибкой, но, вероятно, она сохранена как есть для обратной совместимости. Или что-то в этом роде.)

Еще один хороший способ — использовать SafeConfigParser, который выдаст TypeError если вы попытаетесь установить нестроковое значение, чтобы вы знали, что это больше не повторится.

person roippi    schedule 31.01.2014
comment
Он также может находиться в словаре значений по умолчанию, передаваемых при создании экземпляра ConfigParser. - person Peter Westlake; 31.01.2014