python - 在 Dict 上运行 del 命令会随机导致“del TypeError: 'tuple' object doesn't support item删除”
问题描述
此错误随机发生,但不是第一次发生。这是一个字典,所以我不知道它何时或为什么转换为元组。
即使我在检查它是否给出 TypeError 时进行调试,我也会检查数据类型并显示“Dict”。
这是给我带来问题的行:
del db_backup[name][n]
db_backup
是全局范围内的字典name
是一个字符串n
是一个整数
以下是程序中引用 db_backup 的其他时间:
# Global initiliaztion
db_backup = {}
def init():
global db_backup
...
db_backup = load_database()
...
def load_database():
try:
with open('persons_db.json', 'r') as fp:
return json.load(fp)
sync_db(i, rs):
...
person_id_list = db_backup[name]
...
person_data[i].set_p_id(int(db_backup[name][n+1]))
...
del db_backup[name][n] <-- Trouble line
def backup_db(name, rs):
key = create_db_key(name, rs)
db_backup.update(key)
with open('person_db.json', 'w') as fp:
json.dump(db_backup, fp, indent=2)
def create_db_key(name, rs):
key = {}
key.update({name: (rs[0].id_str, rs[1].id_str, rs[2].id_str, r[3].id_str)})
return key
解决方案
正如我们在文档中看到的tuple
s 是不可变的。
>>> t = 12345, 54321, 'hello!' ... >>> # Tuples are immutable: ... t[0] = 88888 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object does not support item assignment >>> # but they can contain mutable objects: ... v = ([1, 2, 3], [3, 2, 1]) >>> v ([1, 2, 3], [3, 2, 1])
但是它可以包含可变对象作为list
s,因此如果您需要删除一个元素,您可以list
在您的内部使用 a tuple
,或list
直接使用
例如:
rs_list = [rs[0].id_str, rs[1].id_str, rs[2].id_str, r[3].id_str]
key.update({name: (rs_list)})
# or
key.update({name: rs_list})
如果出于向后兼容性的原因无法使用 a list
,并且您确实需要 a tuple
,则可以使用生成器即时重新创建它:
例如:
to_remove = [name][n] # Assuming this is a unique str.
db_backup[name] = tuple(x for x in db_backup[name] if not to_remove)
注意:它有时工作的事实更多的是错误而不是功能。如果它有效,它不应该。
推荐阅读
- mysql - 即使其中之一不符合搜索条件,Mysql Join也会获得多行
- java - 在 android Studio 中迭代包含列表/数组的 JSON 对象
- android - 我如何知道正在添加哪个依赖项运行时权限?
- python - 如何为组创建属性并在 hdf5 文件系统中访问它们?
- c++ - 从 v8::Module 获取 ScriptOrigin
- c# - 从 Oracle 托管数据访问 c# 中间歇性 Oracle 连接请求超时
- naming-conventions - ASP.NET 样板误导命名约定和文件结构
- python - AttributeError:“请求”对象在发出 GET 请求时没有属性“获取”
- scrapy - 如何使用 CrawlSpider 抓取多个 json 页面?
- javascript - 如何不允许在 div中使用 javascript 首先拖动现有的可拖动对象?我只想要一个可拖动的 div 吗?