来自配置解析器的python字典,如果值和值中的"%(":"int"类型的参数不可迭代

use*_*318 3 python config configparser

随机出现此错误,有时会出现,有时不会:

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

这是错误

  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
Run Code Online (Sandbox Code Playgroud)

为什么它引用为int,如果我将它转换为字符串?

roi*_*ppi 5

代码中的某处你正在这样做:

config.set('something', 'something', 0) # or some integer
Run Code Online (Sandbox Code Playgroud)

或者,您可以选择在ConfigParser构造函数中传入非字符串值dict.

这与文档所说的完全相反:

如果给定部分存在,则将给定选项设置为指定值; 否则引发NoSectionError.虽然可以将RawConfigParser(或原始参数设置为true的ConfigParser)用于非字符串值的内部存储,但只能使用字符串值实现完整功能(包括内插和输出到文件).

因此,无论何时打电话ConfigParser.set,请确保包装您正在设置的内容str.否则,当它遍历所有值时会抛出错误_interpolate.(我认为这种行为的某些部分是一个错误,但它可能保持原样以便向后兼容.或者某些东西.)

另一个好处是使用如果你试图设置一个非字符串值SafeConfigParser将抛出一个TypeError,所以你知道这不会再发生.