[英]Find the combination Geometric Sequence number in the ratio of 2
通過給定的權限類,有沒有更好的方法可以使我的list_permission方法附魔,我可以找出可用的權限
我試過的
class Permission:
READ = 1
WRITE = 2
EDIT = 4
DELETE = 8
sum = 0
def has_permission(num, perm):
"""
Return boolean for permission checking
>>> has_permission(Permission.Read)
assume sum = 6
False
"""
return num & perm == perm
def add_permission(num, perm):
"""
sum permission number
>>> add_permission(Permission.Read)
sum + 1
"""
return num += perm
def list_permission(num):
pers = (per for per in dir(Permission) if not per.startswith("__"))
lists = []
for value in pers:
if(has_permission(num, getattr(Permission, value))):
lists.append(value)
return lists
> print(list_permission(6))
> # [WRITE, EDIT]
一個小的優化可能是使用Permission.__dict__
而不是dir(Permission)
。 閱讀本文以了解dir()
和__dir__
之間的區別嗎?
def list_permission(num):
lists = []
for key, val in Permission.__dict__.items():
# Changed "__" to "_" in key.startswith.
if not key.startswith("_") and has_permission(num, val):
lists.append(key)
return lists
如果您需要經常訪問list_permission
並且可以使用更多的內存,那么請執行以下操作:
def list_permission(num, cache={}):
if num in cache:
return cache[num]
permissions = []
for key, val in Permission.__dict__.items():
# Changed "__" to "_" in key.startswith.
if not key.startswith("_") and has_permission(num, val):
permissions.append(key)
cache[num] = permissions
return permissions
通過給定的權限類,有沒有更好的方法可以使我的list_permission方法附魔,我可以找出可用的權限
如果可以修改Permission
類,請使用georg在其答案中建議的Enum
。
這是Enum
一個很好的用例:
from enum import Enum
class Permission(Enum):
READ = 1
WRITE = 2
EDIT = 4
DELETE = 8
接着
def list_permission(num):
return [
p.name
for p in Permission
if has_permission(num, p.value)
]
您試圖做的是將數字值“解釋”為可能的權限集,並將結果作為此類權限關鍵字的列表。
由於您分配的值(1, 2, 4, 8)
基本是(2**0, 2**1, 2**2, 2**3)
,因此可以使用decimal to binary
轉換進行建模。 以下函數get_permissions(pnum)
將為您提供所需的輸出。
get_permissions(pnum = 7, permissions_dict = None)
輸出 :
['READ', 'WRITE', 'EDIT']
當您提供的pnum
大於最大允許值(在這種情況下為15
時,它還會處理邊緣情況。
get_permissions(pnum = 19, permissions_dict = None)
輸出 :
WARNING::: MAX allowed value of pnum = 15
['READ', 'WRITE', 'EDIT', 'DELETE']
get_permissions()
請注意,如果需要,您可以提供用戶指定的permissions_dict
來擴展此功能的范圍。 如果提供了permissions_dict
,則該函數將恢復為其中定義的默認值。
permissions_dict = {'READ': 1, 'WRITE': 2, 'EDIT': 4, 'DELETE': 8}
def get_permissions(pnum = 0, permissions_dict = None):
"""
Returns either a None for pnum=0,
Or,
a list of permission KEYWORDS.
pnum = a non-negative integer
permissions_dict: a dictionary specifying the permissions KEYWORDS
>>> If no permissions_dict is specified, it uses
>>> a default permissions dictionary.
"""
if permissions_dict is None:
permissions_dict = {'READ': 1, 'WRITE': 2, 'EDIT': 4, 'DELETE': 8}
# Max allowed value of pnum
pnum_max = np.array(list(permissions_dict.values())).sum()
if pnum==0:
perm = None
else:
if pnum>pnum_max:
print("WARNING::: MAX allowed value of pnum = {}".format(pnum_max))
pnum = pnum_max
permissions = list(permissions_dict.keys())
# Convert Decimal to Binary
# ==> Convert to list of chars
# ==> Keep 4 chars: use str.zfill(4)
# ==> Flip Order
# Logic with Example:
# Dec(7) --> Bin(111)
# ---> `0111`
# ---> ['0','1','1','1']
# ---> ['1','1','1','0']
p = list(str(int(bin(pnum)[2:])).zfill(4))
p.reverse()
# Extract permissions as KEYWORDS
imax = len(permissions)
perm = [permissions[i] for i,x in enumerate(p) if bool(int(x)) and i<imax]
return perm
我希望這有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.