遇到类型错误:在ruamel.yaml上调用更新时'int'对象不可下标.注释导入注释地图



当我试图将代码更新到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

最新更新