You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何将frozenset权限分配给用户以获取期望输出?

Python权限分配问题:修复frozenset赋值错误及类型选择

我是Python初学者,从Twitter上获取了以下代码。请问如何将frozenset类型的权限分配给每个用户,以得到期望的输出?输出是否必须为frozenset类型?

原代码

admin_permissions = frozenset(['view', 'edit', 'delete', 'add'])
editor_permissions = frozenset(['view', 'edit', 'add','deny'])
viewer_permissions = frozenset(['view'])

admins = {'Alice', 'Bob'}
editors = {'Bob', 'Charlie', 'Dave'}
viewers = {'Eve', 'Frank', 'Alice'}

user_permissions = {}
for user in admins:
    user_permissions[user] = admin_permissions
for user in editors:
    user_permissions.setdefault(user, frozenset()).union(editor_permissions)
for user in viewers:
    user_permissions.setdefault(user, frozenset()).union(viewer_permissions)

print(user_permissions)

当前输出

{'Bob': frozenset({'edit', 'add', 'delete', 'view'}),
 'Alice': frozenset({'edit', 'add', 'delete', 'view'}),
 'Dave': frozenset(), 
 'Charlie': frozenset(), 
 'Frank': frozenset(), 
 'Eve': frozenset()
}

期望输出

{'Bob': frozenset({'edit', 'add', 'delete', 'view', 'deny'}),
 'Alice': frozenset({'edit', 'add', 'delete', 'view'}),
 'Dave': frozenset({'edit', 'add', 'view', 'deny'}), 
 'Charlie': frozenset({'edit', 'add', 'view', 'deny'}), 
 'Frank': frozenset({'view'}), 
 'Eve': frozenset({'view'})
}

问题修复:正确合并frozenset权限

原代码的核心问题是:frozenset.union()方法会返回一个新的frozenset,不会修改原集合对象。之前调用union后没有把结果赋值回user_permissions,导致后续用户的权限根本没更新。

修正后的代码如下:

admin_permissions = frozenset(['view', 'edit', 'delete', 'add'])
editor_permissions = frozenset(['view', 'edit', 'add','deny'])
viewer_permissions = frozenset(['view'])

admins = {'Alice', 'Bob'}
editors = {'Bob', 'Charlie', 'Dave'}
viewers = {'Eve', 'Frank', 'Alice'}

user_permissions = {}
# 初始化管理员权限
for user in admins:
    user_permissions[user] = admin_permissions
# 合并编辑权限:先取已有权限,再和编辑权限合并后赋值回去
for user in editors:
    current_perms = user_permissions.get(user, frozenset())
    user_permissions[user] = current_perms.union(editor_permissions)
# 合并查看者权限:同理处理
for user in viewers:
    current_perms = user_permissions.get(user, frozenset())
    user_permissions[user] = current_perms.union(viewer_permissions)

print(user_permissions)

运行这段代码就能得到你想要的结果:Bob会同时拥有管理员和编辑的所有权限,其他用户也能正确拿到对应角色权限的合集。

输出是否必须为frozenset类型?

不是必须的,完全取决于你的需求:

  • 如果权限集合不需要后续修改(比如固定的角色权限),用frozenset没问题,它是不可变类型,能避免意外修改权限。
  • 如果后续需要动态调整用户权限(比如给某个用户新增/删除权限),建议用普通的set,因为frozenset不支持添加、删除元素的操作,灵活性更低。

内容的提问来源于stack exchange,提问作者k1dr0ck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 00:06:02