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
相关产品推荐
相关产品推荐

