Python shelve存储自定义对象与字符串'0'比较异常求助
问题排查与解决步骤
1. 先确认变量的真实类型与值
别只依赖打印的视觉效果,直接输出变量的类型和原始字面量,这能快速定位问题:
print(type(db_ID_1), repr(db_ID_1))
如果输出是 <class 'int'> 0,说明它确实是整数类型而非字符串;如果是 <class 'str'> '0',那问题可能出在自定义类的逻辑上。
2. 检查自定义类ID_1_db的实现
如果db_ID_1是类实例,而非直接存储的字符串,大概率是你取数据时没访问实例的属性,或者类的序列化逻辑改变了类型:
- 错误示例:直接用实例和字符串比较
class ID_1_db: def __init__(self, value): self.value = value # 存储 with shelve.open('mydb') as db: db['ID_1'] = ID_1_db('0') # 错误取值:直接拿实例比较 db_ID_1 = db['ID_1'] if db_ID_1 != '0': # 实例和字符串永远不等 # 执行错误分支
- 修复方式:取数据时访问实例的目标属性
db_ID_1 = db['ID_1'].value
- 额外保障:在类初始化时强制属性为字符串类型
class ID_1_db: def __init__(self, value): # 强制转换为字符串,避免传入数字类型 self.value = str(value)
如果类实现了__getstate__或__setstate__方法,检查这些方法是否在序列化/反序列化时把字符串转成了数字。
3. 验证shelve的存取逻辑
存储前先确认要存的内容确实是字符串:
target_val = '0' print(type(target_val), repr(target_val)) # 需输出 <class 'str'> '0' with shelve.open('mydb') as db: db['ID_1'] = target_val # 若存类实例,确保实例的value属性是字符串
4. 临时应急修复(不推荐长期用)
如果暂时找不到类型变化的根源,可以在判断时统一转换类型:
if str(db_ID_1) != '0': # 错误分支 else: # 正确分支
内容的提问来源于stack exchange,提问作者MENTORJJ
相关产品推荐
相关产品推荐

