遇到 TypeError: 'int' 对象在 ruamel.yaml.comments import CommentedMap 上调用更新时不可下标

如何解决遇到 TypeError: 'int' 对象在 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,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,10)
before: ordereddict([('number_to_name','name2')]))])
after:  ordereddict([('number_to_name','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','name2')])),(4,'name4')])
==========
number_to_name:
  1: name1
  2: name2
4: name4

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?