Ruby中User类基于账户类型设置Permissions变量时为空问题
嘿,我来帮你搞定这个Permissions为空的问题!这种情况我碰到过好多次,大概率是JSON读取或者类初始化的逻辑出了点小纰漏,咱们一步步排查:
可能的问题与对应解法
1. JSON文件路径不对,根本没读到内容
很多时候会踩这个坑:你以为JSON和脚本在同一个文件夹,但实际运行脚本时的工作路径不一样,导致找不到文件。
解决办法:
- 用绝对路径读取JSON,避免路径问题:
import json import os # 获取当前脚本所在的绝对目录 script_folder = os.path.dirname(os.path.abspath(__file__)) # 拼接JSON文件的完整路径 json_file_path = os.path.join(script_folder, "你的权限映射文件名.json") # 读取JSON with open(json_file_path, "r", encoding="utf-8") as f: permissions_map = json.load(f)
2. 账户类型和JSON里的键不匹配
比如你实例化时传的是"Admin",但JSON里的键是"admin"(大小写不一样),或者拼写错了,自然找不到对应的权限。
解决办法:
- 实例化时打印下传入的账户类型和JSON里的所有键,对比是否一致:
class User: def __init__(self, account_type): self.account_type = account_type # 先读取权限映射(上面的路径代码) print(f"当前账户类型: {account_type}") print(f"JSON里的权限键: {list(permissions_map.keys())}") # 用get方法兜底,找不到就返回空列表 self.Permissions = permissions_map.get(account_type, [])
3. 类的初始化逻辑有问题
比如你把Permissions定义成了类变量,或者在__init__外面赋值,导致实例化时没正确覆盖。
正确的User类示例:
import json import os class User: # 把权限映射设为类变量,避免每次实例化都读JSON,提升效率 _permissions_cache = None def __init__(self, account_type): self.account_type = account_type # 第一次实例化时才读取JSON if not User._permissions_cache: script_folder = os.path.dirname(os.path.abspath(__file__)) json_path = os.path.join(script_folder, "permissions_map.json") with open(json_path, "r", encoding="utf-8") as f: User._permissions_cache = json.load(f) # 赋值权限 self.Permissions = User._permissions_cache.get(account_type, []) # 测试一下 admin_user = User("admin") print(admin_user.Permissions) # 应该输出对应的权限列表 guest_user = User("guest") print(guest_user.Permissions)
4. JSON文件本身有语法错误
比如漏了逗号、引号不配对,导致json.load()失败,但你没捕获异常,Permissions就没被赋值。
解决办法:
- 加个异常捕获,快速定位问题:
try: with open(json_path, "r", encoding="utf-8") as f: permissions_map = json.load(f) except json.JSONDecodeError as e: print(f"JSON格式错啦!错误位置: {e.pos}, 错误信息: {e.msg}")
另外,给你一个标准的权限映射JSON示例,你可以对照检查:
{ "admin": ["创建用户", "修改权限", "删除内容"], "editor": ["编辑内容", "查看内容"], "guest": ["查看内容"] }
内容的提问来源于stack exchange,提问作者Samuel B
相关产品推荐
相关产品推荐

