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