Running into TypeError: 'int' object is not subscriptable when calling update on ruamel.yaml.comments import CommentedMap

Running into TypeError: 'int' object is not subscriptable when calling update on ruamel.yaml.comments import CommentedMap

当我尝试将我的代码更新到 ruamel.yaml 的新版本时,我遇到了 运行 问题。

代码:

import sys
import ruamel.yaml

print('Python', tuple(sys.version_info), ', ruamel.yaml', ruamel.yaml.version_info)

yaml_str = """\
number_to_name:
   1: name1
   2: name2
"""

yaml = ruamel.yaml.YAML()
data = yaml.load(yaml_str)
print('before:', data)
data.update({4: 'name4'})
print('after: ', data)
print('==========')
yaml.dump(data, sys.stdout)

输出 ruamel.yaml (0, 17, 4):

Python (3, 6, 13, 'final', 0) , ruamel.yaml (0, 17, 4)
before: ordereddict([('number_to_name', ordereddict([(1, 'name1'), (2, 'name2')]))])
Traceback (most recent call last):
  File "/home/lib/python3.6/site-packages/ruamel/yaml/comments.py", line 779, in update
    self._ok.update(vals.keys())  # type: ignore
AttributeError: 'tuple' object has no attribute 'keys'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "bin/runamel.py", line 15, in <module>
    data.update({4: 'name4'})
  File "/home/lib/python3.6/site-packages/ruamel/yaml/comments.py", line 783, in update
    self._ok.add(x[0])
TypeError: 'int' object is not subscriptable

与旧版本相同的代码工作正常。

输出 ruamel.yaml (0, 16, 10)

Python (3, 6, 13, 'final', 0) , ruamel.yaml (0, 16, 10)
before: ordereddict([('number_to_name', ordereddict([(1, 'name1'), (2, 'name2')]))])
after:  ordereddict([('number_to_name', ordereddict([(1, 'name1'), (2, 'name2')])), (4, 'name4')])
==========
number_to_name:
  1: name1
  2: name2
4: name4

我做错了什么? (我还怀疑第 779 行的 vals.keys() 总是会引发属性错误,因为 vals 是一个元组)

这是 ruamel.yaml 版本 0.6.12 和 0.6.13 之间引入的问题。已修复 在版本 0.17.9

import sys
import ruamel.yaml

print('Python', tuple(sys.version_info), ', ruamel.yaml', ruamel.yaml.version_info)

yaml_str = """\
number_to_name:
   1: name1
   2: name2
"""

yaml = ruamel.yaml.YAML()
data = yaml.load(yaml_str)
print('before:', data)
data.update({4: 'name4'})
print('after: ', data)
print('==========')
yaml.dump(data, sys.stdout)

给出:

Python (3, 9, 4, 'final', 0) , ruamel.yaml (0, 17, 9)
before: ordereddict([('number_to_name', ordereddict([(1, 'name1'), (2, 'name2')]))])
after:  ordereddict([('number_to_name', ordereddict([(1, 'name1'), (2, 'name2')])), (4, 'name4')])
==========
number_to_name:
  1: name1
  2: name2
4: name4