簡體   English   中英

找到比率為2的組合幾何序列號

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM