处理存档文件时触发TypeError:无法解包不可迭代布尔对象求助
错误排查与解决:TypeError: cannot unpack non-iterable bool object
错误信息
> File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.11_3.11.2544.0_x64__qbz5n2kfra8p0\Lib\tkinter\__init__.py", line 1967, in __call__ return self.func(*args) ^^^^^^^^^^^^^^^^ File "d:\source\BBSaveEditorFix\app.py", line 291, in _process_data_user self.data, self.user = process_user(self.file_location) ^^^^^^^^^^^^^^^^^^^^ TypeError: cannot unpack non-iterable bool object
相关代码
app.py中_process_data_user相关代码
def _load_all_gems(self): if self.gems is None: messagebox.showwarning("File not loaded!", "You can not reset all modifications since no file is loaded") return self.combobox_all_gems['values'] = [list(gem.get_original_stats())[0] for gem in self.gems] def _set_original_gem_stats(self, e=None): if e is not None: for gem in self.gems: if list(gem.get_original_stats())[0] == e.widget.get(): self.selected_gem = gem for i, (gem_menu, value) in enumerate(zip(self.all_gem_menu, list(self.selected_gem.get_original_stats()))): if i > 2: gem_menu.set(value) else: gem_menu.config(state="normal") gem_menu.delete(0, END) gem_menu.insert(INSERT, value) gem_menu.config(state="disabled") def _process_data_user(self): if self.file_location is None: messagebox.showwarning("User not loaded!", "No file selected") self.data, self.user = process_user(self.file_location) self._set_original_users_stats() def _process_data_gems(self): if self.file_location is None: messagebox.showwarning("File not loaded!", "No file selected") self.data, self.gems = process_gems(self.file_location) self._load_all_gems() def _open_file_selection(self): self.file_location = filedialog.askopenfilename(initialdir="./") self.file_loc_ent.config(state="normal") self.file_loc_ent.delete(0, END) self.file_loc_ent.insert(INSERT, self.file_location) self.file_loc_ent.config(state="disabled")
process_user与process_gems相关代码
def proecess_user(filename: str): data = None with open(filename, "rb") as f: data = f.read() hexdata = binascii.hexlify(data) if not data.startswith(b"41000000000000"): return False return data, extract_user_info(data) def process_gems(filename: str): data = None with open(filename, "rb") as f: data = f.read() data = binascii.hexlify(data) if not data.startswith(b"41000000000000"): return False return data, extract_gems(data)
问题根源
- 返回值类型不一致:文件格式验证失败时返回单个布尔值
False,验证成功时返回(data, 结果对象)元组。调用处试图将返回值解包给两个变量,布尔值不可迭代,直接触发TypeError。 - 函数拼写错误:定义的函数名是
proecess_user(多了一个字母'e'),但调用时使用process_user,会导致函数无法正确匹配(若未触发NameError,说明是代码复制时的笔误,但实际运行中会引发逻辑错误)。 - 错误分支未终止执行:
_process_data_user和_process_data_gems中,当self.file_location为None时,弹出警告后未终止函数,后续依然会调用处理函数,传入None会引发文件读取错误或验证失败返回False,最终触发解包错误。
解决方法
1. 统一函数返回值类型
将验证失败的返回值改为可迭代的(None, None),保证与成功返回值结构一致:
def process_user(filename: str): data = None with open(filename, "rb") as f: data = f.read() # 移除未使用的hexdata变量 if not data.startswith(b"\x41\x00\x00\x00\x00\x00\x00"): return None, None return data, extract_user_info(data) def process_gems(filename: str): data = None with open(filename, "rb") as f: data = f.read() hex_data = binascii.hexlify(data) if not hex_data.startswith(b"41000000000000"): return None, None return hex_data, extract_gems(hex_data)
注:
process_gems中重命名了转换后的变量,避免覆盖原始二进制数据,同时修正验证逻辑的匹配对象。
2. 修正函数拼写错误
将proecess_user改为process_user,确保函数定义与调用名称完全一致。
3. 完善错误分支逻辑
在弹出警告后立即终止函数执行,并新增无效文件的判断提示:
def _process_data_user(self): if self.file_location is None: messagebox.showwarning("User not loaded!", "No file selected") return self.data, self.user = process_user(self.file_location) if self.data is None or self.user is None: messagebox.showerror("Invalid File", "Selected file is not a valid user save file") return self._set_original_users_stats() def _process_data_gems(self): if self.file_location is None: messagebox.showwarning("File not loaded!", "No file selected") return self.data, self.gems = process_gems(self.file_location) if self.data is None or self.gems is None: messagebox.showerror("Invalid File", "Selected file is not a valid gems save file") return self._load_all_gems()
内容的提问来源于stack exchange,提问作者noob
相关产品推荐
相关产品推荐

