Декораторы. Отфильтровать словари у кого 'is_admin' = True и вызывать фкнуцию которую он декорирует

def only_admin(func):
    def wrapper(user):
        for u in user:
            if u["is_admin"] is True:
                return func(u)
    return wrapper

@only_admin
def create_permissions(users: list) -> None:
    for user in users:
        print(f'Creating permissions for {user["username"]}')


create_permissions([
     {'username': 'admin', 'is_admin': True},
     {'username': 'custom_user1', 'is_admin': False}, {'username': 'custom_user2', 'is_admin': False},
     , ])

Ответы (2 шт):

Автор решения: falm

После декорирования получается вложенный цикл Один можно убрать

def only_admin(func):
    def wrapper(user):
        for u in user:
            if u["is_admin"] is True:
                func(u)
    return wrapper

@only_admin
def create_permissions(user: dict) -> None:
    print(f'Creating permissions for {user["username"]}')
→ Ссылка
Автор решения: vadim vaduxa

Видимо имеется виду это, но пихать это в декоратор имеет смысл только если есть несколько функций, требующих подобную обработку аргументов

def only_admin(key_dt):
    def decor(func):
        it = key_dt.items()
        def wrapper(user):
            return func([u for u in user if not it - u.items()])
        return wrapper
    return decor

@only_admin({"is_admin": True, 'role': 2})
def create_permissions(users: list) -> None:
    for user in users:
        print(f'Creating permissions for {user["username"]}')


create_permissions([
    {'username': 'admin1', 'is_admin': True, 'role': 1},
    {'username': 'admin2', 'is_admin': True, 'role': 2},
    {'username': 'custom_user1', 'is_admin': False},
    {'username': 'custom_user2', 'is_admin': False},
])

# Creating permissions for admin2
→ Ссылка