Python编写token生成器遇NameError及buy_tokens打印函数地址问题
问题排查与修复方案
问题1:NameError: name 'token' is not defined 错误成因
你在全局选择购买token的分支中,直接调用buy_tokens(token),但token变量仅在token_generator函数的局部作用域内定义,全局作用域从未声明过该变量,调用时找不到对应变量就会抛出未定义错误。
问题2:调用buy_tokens未正常生成打印token的成因
buy_tokens函数本身没有实现token生成逻辑,完全依赖入参的token值,即便解决了变量未定义的问题,你也没有根据用户选择的购买档位生成对应长度的token。另外原token_generator函数的返回值是openfile函数的执行结果,而openfile没有定义返回值,默认返回None,也无法拿到生成好的token值。
修复建议
- 抽离公共的token生成逻辑为独立函数,避免重复代码,同时让生成token的函数直接返回生成完成的字符串,方便后续调用
- 调整
buy_tokens函数,移除不必要的token入参,内部根据用户选择的档位生成对应长度的token - 修正全局调用
buy_tokens的逻辑,不需要传入未定义的变量 - 可选优化:原
openfile函数用的是w写入模式,每次写入会覆盖之前的token,如果需要留存历史生成记录,可以改成a追加模式
修复后核心代码示例
from random import randint import string import time import random import os print("Tokens are saved to your tokens.txt file. \n \n \n") def openfile(token): save_path = r"C:\Users\User\Desktop" file_name = "tokens.txt" full_name = os.path.join(save_path, file_name) print(full_name) # 改成a模式可以保留历史token,每次换行追加 file1 = open(full_name, "a", encoding="utf-8") file1.write(str(token) + "\n") file1.close() # 抽离公共生成函数 def generate_token(length, extra_word=""): all_chars = string.ascii_letters + string.digits + string.punctuation base_token = "".join(random.sample(all_chars, length)) final_token = base_token + extra_word print(final_token) return final_token def token_generator(): print("欢迎使用免费token生成器,作者:Thomas") token_length = int(input("\n请输入你想要生成的token长度:\n")) token_word = input("请输入你想在token中添加的便于记忆的自定义内容(可不填):\n") print("正在生成token.......") time.sleep(random.randint(1, 5)) print("\nToken可用于生成随机字符串混淆配置信息,生成结果已保存到tokens.txt文件:\n") token = generate_token(token_length, token_word) openfile(token) return token def buy_tokens(): total_dirtycoins = 150 print("欢迎来到token商店,单个基础token售价50金币,您当前账户余额为150金币") print("购买小型token:50金币(1)\n购买中型token:100金币(2)\n购买大型token:150金币(3)") selection_mode = input("输入'1'选择选项1,输入'2'选择选项2,输入'3'选择选项3:\n请输入:") length_map = {"1": 10, "2": 20, "3": 30} cost_map = {"1": 50, "2": 100, "3": 150} type_map = {"1": "小型", "2": "中型", "3": "大型"} if selection_mode in length_map: total_dirtycoins -= cost_map[selection_mode] token = generate_token(length_map[selection_mode]) print(f"您已成功购买{type_map[selection_mode]}token,生成结果已保存到桌面的tokens.txt文件中") print(f"您的账户剩余金币:{total_dirtycoins}") openfile(token) else: print("购买失败,权限拒绝。") select_market = input("选择功能:选项1:自定义生成token,选项2:购买token\n") if select_market == "1": token_generator() elif select_market == "2": buy_tokens() else: print("未找到对应功能,权限拒绝。")
内容的提问来源于stack exchange,提问作者thomas theocharis
相关产品推荐
相关产品推荐

